Lucene RangeQuery没有适当过滤

时间:2009-04-02 02:30:29

标签: c# lucene lucene.net

我正在使用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));

2 个答案:

答案 0 :(得分:6)

更新:就像@basZero在评论中所述,从Lucene 2.9开始,您可以在文档中添加numeric fields。只需记住在搜索时使用NumericRangeQuery而不是RangeQuery。

原始答案

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

0
1
12
123
2
22

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

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

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

示例:

<击>

<击>
-00002.12
-00001

<击>

000000
000001
000003.1415
000022

UPDATE :负数有点棘手,因为-1按字母顺序排在-2之前。 This article给出了关于处理Lucene中的负数和数字的完整解释。基本上,你必须将数字“编码”成使得项目顺序合理的东西。

答案 1 :(得分:0)

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

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;
}

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