【问题标题】:Lucene RangeQuery doesn't filter appropriatelyLucene RangeQuery 没有正确过滤
【发布时间】:2009-04-02 02:30:28
【问题描述】:

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

【问题讨论】:

    标签: c# lucene lucene.net


    【解决方案1】:

    更新:就像@basZero 在他的评论中所说,从Lucene 2.9 开始,您可以将numeric fields 添加到您的文档中。请记住在搜索时使用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 之前。 This article 给出了关于在 Lucene 中处理负数和一般数字的完整解释。基本上,您必须将数字“编码”成使项目的顺序有意义的东西。

    【讨论】:

    • 能否请您告诉我如何使用 rangequery 获取十进制数?谢谢!
    • 对于小数(我假设您的意思是带有小数部分的小数),您需要按比例放大它们,例如。乘以一百万,并删除任何余数:1.2 -> 1200000。乘以的数量取决于您需要精确到多少小数位。
    • ...当然,正如itsadok 所说,您仍然需要对它们进行零填充。我应该说 1.2 -> 0001200000
    • 无需放大。按字母顺序,1.234 在 1.3 之前。
    • 使用 Lucene 2.9.x 可以在索引中添加数字。
    【解决方案2】:

    我创建了一个 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;
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      相关资源
      最近更新 更多