Lucene 高级搜索

news/2025/2/26 7:34:38

自定义评分

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


http://www.niftyadmin.cn/n/975986.html

相关文章

【TeeChart .NET教程】(四)轴控制

2019独角兽企业重金招聘Python工程师标准>>> 上一篇&#xff1a;【TeeChart .NET教程】&#xff08;三&#xff09;图表分页 下一篇&#xff1a;【TeeChart .NET教程】&#xff08;五&#xff09;图例设计 【下载TeeChart.Net最新版本】 TeeChart Pro将自动为用户定…

汇编语言

1.相对跳转指令 b,bl 不同之处在于&#xff0c;bl指令除了跳转之外&#xff0c;还将返回地址&#xff08;bl的下一条指令的地址&#xff09;保存在lr寄存器。 范例&#xff1a; b fun1 fun1: b1 fun2 fun2: 注意&#xff1a;跳转范围是当前指令的前后32MB。 2.数据传送指令mov…

SpringBoot 异常:Target object must not be null

2019独角兽企业重金招聘Python工程师标准>>> 使用JSON格式请求时&#xff0c;添加RequestBody注解映射实体类 .16:59:02.449 [http-nio-8081-exec-2] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context w…

字符数组char s[31]用于保存不超过30个字符的字符串,利用指针编程,统计s[31]中给定字符的个数。要求用函数实现功能,主程序只完成数据的输入输出。

被调用函数原型&#xff1a;void CountChar(char *str, char ch&#xff0c;int *counter)&#xff0c;str是指向字符串的指针&#xff0c;ch是被统计的字符&#xff0c;counter是保存字符ch个数的指针。 输入提示信息&#xff1a;"Input string:\n" …

php如何连接mysql,并操纵后台服务器运作的过程

PHP&#xff0c;一个嵌套的缩写名称&#xff0c;是英文超级文本预处理语言&#xff08;PHP:Hypertext Preprocessor&#xff09;的缩写。PHP 是一种 HTML 内嵌式的语言&#xff0c;PHP与微软的ASP颇有几分相似&#xff0c;都是一种在服务器端执行的嵌入HTML文档的脚本语言&…

【网络】如何快速查找设备的网络接口

故事是这样的。那天小F到IDC机房去拿一台无线控制器&#xff0c;结果到了IDC机房之后才发现竟然有两台一模一样的无线控制器&#xff0c;连标签都一模一样。小F想到了通过IP地址来查找无线控制器的交换机接口&#xff0c;但是小F没有带笔记本&#xff0c;外接的显示器和键盘也全…

face-recognition多人脸识别实时检测代码实例加精细化讲解

目录 完整代码&#xff08;图片自己放&#xff09; 一.导库 二.加图片 三.BGR 转 RGB 四.检测人脸 face_locations(img, times_upsample1, model"hog"): 五.人脸特征编码&#xff08;将图片中的已知人脸图像编码成128维特征向量&#xff09; face_encodings…

LoadRunner添加检查点

见过磕长头的人吗&#xff1f;他们的脸和手都很脏&#xff0c;可是心灵却很干净。                                          ——《可可西里》 1、选择需要设置检查点的内容 有如下“添加客户”功能&#xff0c;添加任务操作完成之…