2011-04-29 50 views
3

我用下面的语句来索引日期:范围查询使用Lucene 2.9.x - 在索引中的日期不工作

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?我还没有尝试过。但是,如果文本查询也可以工作,那将会很棒。任何想法???

回答

3

如果你想有一个范围查询到的YYYYMMDD形式,然后索引你的约会像这样使用日期的工作:

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

谢谢,我会试试这个...所以你也说标准查询解析器支持范围查询,对吧?因为['Moleski'](http://stackoverflow.com/questions/5835232/range-query-with-lucene-2-9-x-dates-in-index-are-not-working/5844872#5844872)说不同的东西... – basZero 2011-05-01 08:46:52

+0

只是一个问题:通过添加一个'Field'而不是'NumericField'我假设它被存储为索引中的TEXT属性。目前我在索引中(通过Luke)看到我的日期值为DATE。如果它存储为TEXT,我猜你不能通过API进行范围查询,对吧?如果是这样,它也不是我想要的... – basZero 2011-05-01 10:31:58

+0

是的,你可以对字符串进行范围查询,参见http://lucene.apache.org/java/2_4_0/queryparsersyntax.html#Range%20Searches。 – 2011-05-02 08:01:26

1

尝试声明my-date-propertyDateField

由于您使用NumbericField我想你指定的范围被解释为数值范围而不是日期范围。在这种情况下,编号20100101和20110101太低而不能得到任何合理的结果。

+0

我试过,但该类不存在了,它已被完全弃用。同样在“Lucene In Action”一书中,他们说使用NumericField。查看javadoc: [DateField Javadoc](http://lucene.apache.org/java/2_9_0/api/all/org/apache/lucene/document/DateField.html) – basZero 2011-04-29 18:36:18

+0

我编辑了我的问题,请看一看。它仍然不工作! – basZero 2011-04-29 18:51:56

1

数字字段和数字范围查询是绝对的辉煌,但他们真的是第一次使用棘手!

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

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

好运