ETJava Beta | Java    注册   登录
  • Lucene4到Lucene7 版本之间的差异

    发表于 2024-04-06 23:32:52     阅读(198)     博客类别:Lucene

    Lucene4.x 到 Lucene7.x 版本之间的差异

    主要从以下几个点开始
    NumericRangeQuery
    BooleanQuery
    Directory
    IndexWriterConfig
    
    

    NumericRangeQuery

    数字范围查询,一般用于价格等域的查询

      /**
         * 测试数字范围查询
         *
         * @throws IOException 读取索引库异常
         */
        @Test
        public void testNumericRangerQuery() throws IOException {
            /*
            版本更新说明:
            在lucene4.10中,关于数字范围的查询是使用的NumericRangerQuery
            使用方式:
            Query query = NumericRangerQuery.newFloatRange(域名,较小值,较大值,是否包含较小值,是否包含较大值)
            在lucene6.6中(不知最早在什么版本,没有细查),NumericRangerQuery被legacyNumericRangerQuery替代
            在lucene7中(应该是从7开始的),lucene开始使用PointValue来替代之前的Filed.而数字范围查询方法也进行了修改,
            Float/Long/IntPoint.newRangeQuery取代了之前的NumericRangeQuery的newFloat/Long/IntRange
            使用方法:
            Query query = Float.newRangeQuery(域名,较小值,较大值);
            而这种查询方法默认包含范围的端点值,即查询的是  较小值<=域名<=较大值
            如果不想包含端点值:
                1.不包含左端点值(即较小值):Query query = Float.newRangeQuery(域名,FloatPoint.nextUp(较小值),较大值);
                2.不包含右端点值(即较大值):Query query = Float.newRangeQuery(域名,较小值,Float.nextDown(较大值));
                3.均不包含:结合1和2即可
             */
            Query query = FloatPoint.newRangeQuery("price", FloatPoint.nextUp(108F), FloatPoint.nextDown(488F));
            doQuery(query);
        }
    

    BooleanQuery

    组合查询,用于多个查询条件组合起来一起参与查询

     /**
         * 测试组合查询
         *
         * @throws IOException 读取索引库异常
         */
        @Test
        public void testBooleanQuery() throws IOException {
    
            //新建两条查询
            Query query1 = new TermQuery(new Term("description", "spring"));
            Query query2 = FloatPoint.newRangeQuery("price", FloatPoint.nextUp(50F), 110F);
    
            /*
             1、MUST和MUST表示“与”的关系,即“交集”。
             2、MUST和MUST_NOT前者包含后者不包含。
             3、MUST_NOT和MUST_NOT没意义
             4、SHOULD与MUST表示MUST,SHOULD失去意义;
             5、SHOUlD与MUST_NOT相当于MUST与MUST_NOT。
             6、SHOULD与SHOULD表示“或”的概念。
    
            版本更新说明:
            在lucene 4.10.3中,组合查询还有无参构造方法,可以通过下面这种方式实现组合查询:
    
            Query query = new BooleanQuery()
            //添加查询条件,并指定该条件的判断级别
            query.add(query1,Occur.MUST);
            query.add(query2,Occur.MUST);
    
            在lucene7.1中,组合查询只有一个有参构造方法,并没有无参构造方法.而是多了一个静态内部类Builder
    
            public static class Builder {
    
                private int minimumNumberShouldMatch;
                private final List<BooleanClause> clauses = new ArrayList<>();
    
                //大概是4.10.3中的BooleanQuery的无参构造
                public Builder() {}
                //设置最小需要匹配的数
                 public Builder setMinimumNumberShouldMatch(int min) {
                     this.minimumNumberShouldMatch = min;
                     return this;
                }
    
                public Builder add(BooleanClause clause) {
                      if (clauses.size() >= maxClauseCount) {
                         throw new TooManyClauses();
                    }
                    clauses.add(clause);
                    return this;
                 }
                 //4.10.3中的BooleanQuery的add方法,支持链式编程(一般使用这个add方法)
                public Builder add(Query query, Occur occur) {
                    return add(new BooleanClause(query, occur));
                }
                //返回一个BooleanQuery,用于构造Query
                public BooleanQuery build() {
                     return new BooleanQuery(minimumNumberShouldMatch, clauses.toArray(new BooleanClause[0]));
                }
            }
    
            7.1中,Occur.MUST等全都放到了BooleanClause中,所以,Occur.MUST等变成了BooleanClause.Occur.MUST等
            所以在lucene中,组合查询的使用方法:
            Query booleanQuery = new BooleanQuery.Builder().add(query1,BooleanClause.Occur.MUST).add(query2,Boolean.Occur.MUST).build();
             */
            Query booleanQuery = new BooleanQuery.Builder().add(query1, BooleanClause.Occur.MUST).add(query2, BooleanClause.Occur.MUST).build();
            doQuery(booleanQuery);
        }
    

    Directory

     /*
            版本变更说明:
            在4.10.3中,FSDirectory.open的参数是file对象,
            可能在6.6以后,开始使用Path类(java.nio.file)
            File对象转Path的方法:
            File file = new File(文件路径);
            Path path = file.toPath();
             */
            File file = new File("D:\\bookIndex\\");
            Directory directory = FSDirectory.open(file.toPath());
            IndexWriter writer = new IndexWriter(directory, config);
    

    IndexWriterConfig

      /*
            可能从6.6开始,IndexWriterConfig就不在需要制定版本了
            而且有了无参构造方法,默认使用的分词器就是StandardAnalyzer.
            即表示,如果你不想更改分词器,就使用无参构造
             */
            IndexWriterConfig config = new IndexWriterConfig();