从Lucene 4.10.3到Lucene 7.1.0:带你了解版本之间的些许差异

来源:互联网 发布:剑灵水鸢天女捏脸数据 编辑:程序博客网 时间:2024/05/21 07:57

一.环境说明:
※Windows 10 v1709
※IDEA 2017.2.6
※JDK 1.8.0_144
※Lucene 7.1.0
二.哪里有差异
因本人能力有限,所以也只是放出我在更新版本的时候,项目中用到的需要升级的地方,其他还未研究.
所以,本文主要从

  • 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);

六.

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

好了,大概就是这样了.
我始终认为,IT从业人员应该经常进行自我更新,包括知识的更新,要保证自己能跟上技术的更新,才能更好的适应新时代的工作要求.

努力吧,少年.


2017/11/16
Lucifer

原创粉丝点击