6

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

2 回答 2

6

更新:就像@basZero 在他的评论中所说,从 Lucene 2.9 开始,您可以在文档中添加数字字段。请记住在搜索时使用NumericRangeQuery而不是 RangeQuery。

原始答案

Lucene 将数字视为单词,因此它们的顺序是字母顺序:

0
1
12
123
2
22

这意味着对于 Lucene,12 介于 0 和 2 之间。如果要进行适当的数字范围,则需要索引数字零填充,然后执行 [0000 TO 0002] 的范围搜索。(您需要的填充量取决于预期的值范围)。

如果您有负数,只需为非负数添加另一个零。(编辑:错错错。见更新)

如果您的数字包含小数部分,请保持原样,并仅对整数部分进行零填充。

例子:

-00002.12
-00001

000000
000001
000003.1415
000022

更新:负数有点棘手,因为 -1 按字母顺序排在 -2 之前。这篇文章给出了关于在 Lucene 中处理负数和一般数字的完整解释。基本上,您必须将数字“编码”成使项目的顺序有意义的东西。

于 2009-04-02T09:26:26.673 回答
0

我创建了一个 PHP 函数,可以将数字转换为 lucene/solr 范围搜索。

0.5转换10000000000.5
-0.5为 转换为09999999999.5

function luceneNumeric($numeric)
{
    $negative = $numeric < 0;
    $numeric = $negative ? 10000000000 + $numeric : $numeric;

    $parts = explode('.', str_replace(',', '.', $numeric));

    $lucene = $negative ? 0 : 1;
    $lucene .= str_pad($parts[0], 10, '0', STR_PAD_LEFT);
    $lucene .= isset($parts[1]) ? '.' . $parts[1] : '';

    return $lucene;
}

它似乎有效,希望这对某人有帮助!

于 2010-05-10T13:54:16.703 回答