Lucene2.9 范围查询Range Query

来源:互联网 发布:淘宝食品网 编辑:程序博客网 时间:2024/05/01 13:19

 

   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:

Java代码 
  1. Query q = NumericRangeQuery.newFloatRange("weight"//field name  
  2.                  new Float(0.3f), //min 从它开始  
  3.                  new Float(0.10f),//max 到它结束  
  4.                  true,  //是否包含min  
  5.                  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.