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.