欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Lucene2.9 范围查询Range Query

程序员文章站 2022-07-09 11:51:47
...

     Apache Lucene 2.9的改进 数字的处理方式的支持,尤其是在范围查询(如“给我找出价格在0.5到9.99英镑之间的CD”)的场景下。在2.9版之前,Lucene的查询完全基于文本,因此对于数字的处理则变成了基于字符串的精确编码。这种做法经常会生成大量独立的关键字,Lucene需要通过遍历的方式来构建整个结果集。在此之前,许多开发人员使用了自定义的编码规则来应对这种情况,不过Lucene 2.9已经自带对数字的处理方式。Field和Query类会采取合适的精度进行索引和搜索,这样大大降低了需要搜索的关键字数量,使查询的响应能力得以显著提高。

 

    在V2.9中,范围查询也有很大的变化,RangeQuery已经不推荐使用,使用TermRangeQuery和NumericRangeQuery两个替代。

    TermRangeQuery:

    NumericRangeQuery:该类还在测试实验中,在其api中,用红字标出:NOTE: This API is experimental and might change in incompatible ways in the next release.  
    NumericRangeQuery:要使用它,首先要使用NumericField 给数字建索引(当然这个的term就是数字的了)。如果你的term是文本,那就是使用TermRangeQuery

    新建NumericRangeQuery:

Query q = NumericRangeQuery.newFloatRange("weight", //field name
                 new Float(0.3f), //min 从它开始
                 new Float(0.10f),//max 到它结束
                 true,  //是否包含min
                 true); //是否包含max

   由于查询数字的term的时间相对更少,所以NumericRangeQuery的性能要比TermRangeQuery好(只对数的情况)。

For optimal performance, re-use the TokenStream and Field instance for more than one document:

  NumericTokenStream stream = new NumericTokenStream(precisionStep);
  Field field = new Field(name, stream);
  field.setOmitNorms(true);
  field.setOmitTermFreqAndPositions(true);
  Document document = new Document();
  document.add(field);

  for(all documents) {
    stream.setIntValue(value)
    writer.addDocument(document);
  }
 

This stream(NumericTokenStream ) is not intended to be used in analyzers; it's more for iterating the different precisions during indexing a specific numeric value.