2011-04-29 51 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編碼)字段。爲此,您需要以生成數字範圍查詢(瞭解編碼)的方式解析查詢。這些工作比文本編碼的數字字段快

好運