2012-11-21 42 views
3

我有一個索引,它包含分析器默認字段中的值abcdef,並且屬於兩個不同的文檔。當我執行查詢abc OR def時,我得到索引中的兩個文檔的匹配。但是當我使用abc OR d?f時,我只能打到包含abc的文檔。當我用d?f查詢索引時,我得到包含def的文檔的命中。爲什麼lucene單字符通配符查詢找不到比完全指定通配符更少的文檔?

當我看看abc OR d?f的解析查詢時,我看到了正確的結果。這意味着將BooleanQuery作爲第二個子句進行解析,其中有一個WildcardQuery

我做錯了什麼?

在我的應用程序中,我還在上面指定的另一個布爾條件之上。這與上面指定的不同字段匹配。所以在我的情況下一個完整的查詢將是:user:john AND (abc OR d?f)。但是我的索引中的所有文檔在user字段中都包含john。所以這不應該是問題。

我正在使用lucene 3.0.3。

編輯:
我當時一看使用luke的指數。在那裏我看到在重寫的查詢中,術語d?f被替換爲()。知道這個查詢很明顯只會匹配abc。但是爲什麼在重寫查詢時替換了通配符?

+0

我必須承認我對Lucene並不熟悉,但粗略看一下文檔似乎證實你的使用應該是正確的。我最初的想法是,有些東西會導致你的第二個查詢被解釋爲正則表達式,因爲這會導致它找不到'def',但正如我所說的,我對Lucene知之甚少。這只是一個我認爲對你有用的想法。 – Thor84no

+0

從您的描述看,這一切看起來是正確的。我想解決這個問題的唯一方法就是將你的用例提取到一個單獨的自包含可運行類中來演示這個問題。 – mindas

+0

你能發表一些代碼嗎? – maxbeaudoin

回答

0

這只是我的錯。測試場景中使用的數據有點複雜。所以術語abc出現在索引中多次。但我只從索引中獲得了10個最高得分的文檔。由於查詢匹配abc之前d?f與最高得分那些結果是第一。因此查詢找不到包含def的文檔。