我正在使用RangeQuery
获取所有文档,其数量在0到2之间。
当我执行查询时,Lucene也会给我提供金额也大于2的文档。我在这里想念什么?
这是我的代码:
Term lowerTerm = new Term("amount", minAmount);
Term upperTerm = new Term("amount", maxAmount);
RangeQuery amountQuery = new RangeQuery(lowerTerm, upperTerm, true);
finalQuery.Add(amountQuery, BooleanClause.Occur.MUST);
这是我的索引:
doc.Add(new Field("amount", amount.ToString(), Field.Store.YES, Field.Index.UN_TOKENIZED, Field.TermVector.YES));
最佳答案
更新:就像@basZero在他的评论中说的那样,从Lucene 2.9开始,您可以将numeric fields添加到您的文档中。只需记住在搜索时使用NumericRangeQuery而不是RangeQuery。
原始答案
Lucene将数字视为单词,因此其顺序为字母顺序:
0
1
12
123
2
22
这意味着对于Lucene,12在0到2之间。如果要设置适当的数值范围,则需要对数字进行零填充索引,然后进行[0000 TO 0002]范围搜索。 (所需的填充量取决于预期的值范围)。
如果您有负数,则只需为非负数添加另一个零即可。 (编辑: WRONG WRONG WRONG 。请参阅更新)
如果您的数字包括小数部分,请保留原样,仅对整数部分进行零填充。
例子:
-00002.12
-00001
000000
000001
000003.1415
000022
更新:负数有点棘手,因为-1按字母顺序位于-2之前。 This article提供了有关处理负数和Lucene中一般数字的完整说明。基本上,您必须将数字“编码”为使项目顺序有意义的内容。