使用LUKE进行Lucene数值范围搜索

时间:2011-02-03 09:20:14

标签: indexing lucene luke

我有许多数字Lucene索引字段:

60000
78500
105000

如果我使用LUKE查询78500,如下所示:

price:78500

它会返回正确的记录,但如果我尝试将所有三个记录作为范围返回,则无法获得结果。

price:[60000 TO 105000]

我意识到这是由于填充,因为Lucene对数字进行了处理,但我只是想知道我应该将什么放入LUKE以返回三条记录。

非常感谢您的帮助。

4 个答案:

答案 0 :(得分:11)

如果字段被索引为NumericField,则必须在查询解析器选项卡和Luke的3.5版本中使用“使用XML查询分析器”选项:

https://code.google.com/p/luke/downloads/detail?name=lukeall-3.5.0.jar&can=2&q=

使用字符串和数字字段的查询示例为:

<BooleanQuery>
<Clause fieldName="colour" occurs="must">
    <TermQuery>rojo</TermQuery>
</Clause>
<Clause fieldName="price" occurs="must">
    <NumericRangeQuery type="int" lowerTerm="4000" upperTerm="5000" />
</Clause>
</BooleanQuery>

答案 1 :(得分:3)

我用于此的解决方案是为价格输入的值需要以填充形式添加到索引中。然后我会查询新的填充值,该值很有用。因此,索引中的新值是:

060000
078500
105000

此解决方案与Umbraco的检查搜索问题相关联,因此论坛上有一个关于如何实现基于数字的范围搜索的线程,如果有人要求它,它位于此处,端到端遍历。

Umbraco Forum Thread

答案 2 :(得分:1)

  1. 零填充不会进入此特定查询,因为您显示的所有数字都具有相同的位数
  2. 您显示的范围查询在范围的第二部分上有太多零
  3. 因此,您显示的数据的查询将为price:[10500 TO 78500]
  4. 希望这有帮助,

答案 3 :(得分:1)

我假设这些字段被编入索引为NumericField s。他们的问题是Lucene / Luke不知道如何自动解析数字查询。你需要覆盖Lucene的QueryParser并提供你自己的逻辑如何解释这些数字。

据我所知,Luke允许坚持使用自定义解析器,它只需要存在于CLASSPATH中。

看看Lucene邮件列表上的这个主题:

http://mail-archives.apache.org/mod_mbox/lucene-java-user/201102.mbox/%3CAANLkTi=XUpyw09tcbjuTzNRpMJa730Cq-6_1agMAjYz6@mail.gmail.com%3E