当前位置: 首页 > news >正文

Lucene 高级搜索

自定义评分

public class MyScoreQuery {

     public void searchByScoreQuery(){
         try {
            IndexSearcher searcher=new IndexSearcher(IndexReader.open(FileIndexUtils.getDirectory()));
             Query q=new TermQuery(new Term("content","java"));
             //创建一个评分
             FieldScoreQuery fd=new FieldScoreQuery("score",Type.INT);
             //2 根据评分域和原有的Query创建自定义的Query对象
             MyCustomScoreQuery query=new MyCustomScoreQuery(q,fd);
             TopDocs tds=null;
             tds=searcher.search(query, 100);
             SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:ss");
             for(ScoreDoc sd:tds.scoreDocs){
                Document d=searcher.doc(sd.doc);
                System.out.println(sd.doc+"("+sd.score+")"+
                "["+d.get("filename")+"【"+d.get("path")+"】--->"+d.get("score")+"--->"+
                 d.get("size")+" "+sdf.format(new Date(Long.valueOf(d.get("date"))))+"]");
            }
             searcher.close();
        } catch (NumberFormatException e) {
            e.printStackTrace();
        } catch (CorruptIndexException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
     }
     

     public void searchByFileScoreQuery(){
         try {
            IndexSearcher searcher=new IndexSearcher(IndexReader.open(FileIndexUtils.getDirectory()));
             Query q=new TermQuery(new Term("content","java"));
            
             FilenameScoreQuery query=new FilenameScoreQuery(q);
             TopDocs tds=null;
             tds=searcher.search(query, 100);
             SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:ss");
             for(ScoreDoc sd:tds.scoreDocs){
                Document d=searcher.doc(sd.doc);
                System.out.println(sd.doc+"("+sd.score+")"+
                "["+d.get("filename")+"【"+d.get("path")+"】--->"+d.get("score")+"--->"+
                 d.get("size")+" "+sdf.format(new Date(Long.valueOf(d.get("date"))))+"]");
            }
             searcher.close();
        } catch (NumberFormatException e) {
            e.printStackTrace();
        } catch (CorruptIndexException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
     }
     
     
     
         private class DateScoreProvider extends CustomScoreProvider{
            long[] dates=null;
            public DateScoreProvider(IndexReader reader) {
                super(reader);
                //通过域缓存获取文件名
                try {
                    dates=FieldCache.DEFAULT.getLongs(reader, "date");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            
            @Override
            public float customScore(int doc, float subQueryScore, float valSrcScore) throws IOException {
                //如何个格局doc的名称获取相应的field的值
                /*
                 * 在reader在没有关闭之前,所有的数据会存储在一个域缓存中,可以通过域缓存获取很多有用的信息
                 */
                long date=dates[doc];
                long today=new Date().getTime();
                long year=1000*60*60*24*365;
                //表示的是这一年之内的
                if(today-date<=year){
                    //为其加分
                }
                
                
                return subQueryScore/1.5f;
            }
                
        }
         
     
     
     @SuppressWarnings("serial")
    private class FilenameScoreQuery extends CustomScoreQuery{

            public FilenameScoreQuery(Query subQuery) {
                super(subQuery);
                
            }

            @Override
            protected CustomScoreProvider getCustomScoreProvider(IndexReader reader) throws IOException {
                
                return  new FilenameScoreProvider(reader);
            }
            
     }
         
     private class FilenameScoreProvider extends CustomScoreProvider{
        String[] filenames=null;
        public FilenameScoreProvider(IndexReader reader) {
            super(reader);
            //通过域缓存获取文件名
            try {
                filenames=FieldCache.DEFAULT.getStrings(reader, "filename");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
        @Override
        public float customScore(int doc, float subQueryScore, float valSrcScore) throws IOException {
            //如何个格局doc的名称获取相应的field的值
            /*
             * 在reader在没有关闭之前,所有的数据会存储在一个域缓存中,可以通过域缓存获取很多有用的信息
             */
            String filename=filenames[doc];
            System.out.println(filename);
            if(filename.endsWith("注解")|| filename .endsWith(".ini")){
                return subQueryScore*1.5f;
            }
            
            return subQueryScore/1.5f;
        }
            
    }
     
     private class MyCustomScoreQuery extends CustomScoreQuery{

        public MyCustomScoreQuery(Query subQuery, ValueSourceQuery valSrcQuery) {
            super(subQuery, valSrcQuery);
            
        }

        @Override
        protected CustomScoreProvider getCustomScoreProvider(IndexReader reader) throws IOException {
            //默认情况实现的评分是通过原有的评分 传入进来的评分域所获取的评分来确定最终打分
            //为了根据不同的需求进行评分,需要自己进行评分设定
            /**
             * 自定评分的步骤
             * 创建一个类继承于CustomScoreProvider
             * 覆盖customScore方法
             */
            return  new MyCustomScoreProvider(reader);
        }
        
     }
     
     private class MyCustomScoreProvider extends CustomScoreProvider{

        public MyCustomScoreProvider(IndexReader reader) {
            super(reader);
            // TODO Auto-generated constructor stub
        }
        
        /**
         * subQueryScore 表示默认文档的打分
         * valScrScore 表示的评分域的打分
         */

        @Override
        public float customScore(int doc, float subQueryScore, float valSrcScore) throws IOException {
            // TODO Auto-generated method stub
            return subQueryScore/valSrcScore;
        }
           
     }

}
View Code

 

 自定义Queryparser

public class CustomParser extends QueryParser {

    public CustomParser(Version matchVersion, String f, Analyzer a) {
        super(matchVersion, f, a);
    }

    @Override
    protected org.apache.lucene.search.Query getFuzzyQuery(String field, String termStr, float minSimilarity)
            throws ParseException {
        throw new ParseException("由于性能原因,已经禁用了模糊查询,请输入更精确的信息进行查询");
    }

    @Override
    protected org.apache.lucene.search.Query getWildcardQuery(String field, String termStr) throws ParseException {
        throw new ParseException("由于性能原因,已经禁用了通配符查询,请输入更精确的信息进行查询");

    }

    @Override
    protected org.apache.lucene.search.Query getRangeQuery(String field, String arg1, String arg2, boolean arg3)
            throws ParseException {
        //
        if(field.equals("size")){
            return NumericRangeQuery.newIntRange(field, Integer.parseInt(arg1), Integer.parseInt(arg2), arg3, arg3);
        }else if(field.equals("date")){
            //格式化日期
            String dateType="yyyy-MM-dd";
            Pattern pattern = Pattern.compile("\\d{4}-\\d{2}-\\d{2}");
            if(pattern.matcher(arg1).matches() && pattern.matcher(arg2).matches()){
                SimpleDateFormat sdf=new SimpleDateFormat(dateType);
                try {
                    long start=sdf.parse(arg1).getTime();
                    long end=sdf.parse(arg2).getTime();
                    return NumericRangeQuery.newLongRange(field, start, end, arg3, arg3);
                } catch (java.text.ParseException e) {
                    e.printStackTrace();
                }
            }
        }
        return new TermRangeQuery(field,arg1,arg2,arg3,arg3);
    }

}
View Code

 

转载于:https://www.cnblogs.com/yaobolove/p/6688245.html

相关文章:

  • linux 小白启航之路-搭建linuxDHCP中继服务器
  • hdu 4122 Alice#39;s mooncake shop (线段树)
  • 三栏布局总结
  • date命令使用文档
  • Qproces的启动
  • [MAC OS] 常用工具
  • Template.
  • Scrum培训心得体会
  • java基础讲解12-----Swing
  • javascript匿名函数及闭包深入理解及应用
  • 如何看懂ORACLE执行计划
  • 关于研发团队建设的一点思考
  • 线程安全-Lock锁synchronized
  • 前端自动化解决方案
  • win2008重新生成SID
  • 分享一款快速APP功能测试工具
  • [nginx文档翻译系列] 控制nginx
  • Apache Zeppelin在Apache Trafodion上的可视化
  • React Transition Group -- Transition 组件
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 阿里云应用高可用服务公测发布
  • 不上全站https的网站你们就等着被恶心死吧
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 关于字符编码你应该知道的事情
  • 区块链技术特点之去中心化特性
  • 容器服务kubernetes弹性伸缩高级用法
  • 实战|智能家居行业移动应用性能分析
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 延迟脚本的方式
  • 原生 js 实现移动端 Touch 滑动反弹
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​卜东波研究员:高观点下的少儿计算思维
  • #ifdef 的技巧用法
  • (day6) 319. 灯泡开关
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (ZT)一个美国文科博士的YardLife
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (转)JAVA中的堆栈
  • (转)四层和七层负载均衡的区别
  • .NET Core WebAPI中封装Swagger配置
  • .NET NPOI导出Excel详解
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET大文件上传知识整理
  • .NET开发者必备的11款免费工具
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • .NET中统一的存储过程调用方法(收藏)
  • @EventListener注解使用说明