使用Lucene 2.9.x进行范围查询 - 索引中的日期不起作用

时间:2011-04-29 17:23:21

标签: java lucene range

我使用以下语句索引日期:

luceneDoc.add(new NumericField(key).setLongValue(date.getTime()));

我还使用如下语句添加文本属性:

luceneDoc.add(new Field(key, value, Field.Store.YES, Field.Index.ANALYZED));

然后我执行文本属性查询:

author:hans

这很完美。但是,当我执行范围查询时,不会返回任何内容:

my-date-property:[20100101 TO 20110101]

我在这里缺少什么?

我看了Luke的索引,我看到了文档的所有文本属性,但是日期属性只出现在概述页面中......也许这是正常的。 如果我这样添加它,我实际上看到了日期属性:

NumericField field = new NumericField(key, Field.Store.YES, true);
field.setLongValue(date.getTime());
luceneDoc.add(field);

但是:查询仍然不起作用!也许它只能在Java中使用Query Builder?我还没试过。但是如果文本查询也可以工作那将是很好的。任何想法???

3 个答案:

答案 0 :(得分:3)

如果您希望范围查询以YYYYMMDD形式使用日期,请将日期编入索引:

String dateString = DateTools.dateToString(date, Resolution.DAY);
luceneDoc.add(new Field(key, dateString, Store.YES, Index.NOT_ANALYZED));

答案 1 :(得分:1)

尝试将my-date-property声明为DateField

由于您使用的是NumbericField,我认为您指定的范围被解释为数字范围而不是日期范围。在这种情况下,数字20100101和20110101太低而无法获得任何合理的结果。

答案 2 :(得分:1)

数字字段和数字范围查询绝对精彩,但首次使用它们确实很棘手!

目前,标准查询解析器不支持数值范围查询。为了使用数字字段,您需要派生自己的查询解析器变体并在适当的时候构造数值范围查询。

澄清我的原始答案(我刚刚在评论中看到它...),我应该注意范围查询,其中数字被转换为(通常)零前缀文本工作正常(尽管相对较慢) )在标准查询解析器中。从发布的原始信息,问题是如何在查询中使用数字(特里编码)字段。为此,您需要以产生数值范围查询(了解trie编码)的方式解析查询。这些很多比文本编码的数字字段更快。

祝你好运