2012-08-03 248 views
3

我已經使用一些數據創建了一個索引。現在我正在使用WildcardQuery來搜索這些數據。索引的文檔具有我正在搜索的字段名稱Product CodeWildcardQuery不返回正確的結果

下面是我使用的用於創建查詢和搜索代碼:

Term productCodeTerm = new Term("Product Code", "*"+searchText+"*");

query = new WildcardQuery(productCodeTerm);

searcher.search(query, 100);

的SEARCHTEXT變量包含用於搜索的搜索字符串該指數。如果當searchString是「JF」,我得到以下結果:

JF32358 
JF5215 
JF2592 

現在,當我嘗試使用25, or f2 or f3或其他任何東西比只使用j,f,jf,然後查詢有沒有命中對方搜索。

我無法理解它爲什麼會發生。有人能幫我理解搜索行爲的原因嗎?

+0

大小寫敏感的問題?相關:http://stackoverflow.com/questions/2432486/lucene-wildcard-queries – 2012-08-03 07:07:55

+0

案件不是這裏的問題。數字部分總是相同的,它們不是大寫或小寫。 – Logan 2012-08-03 09:04:23

+0

但你說'f2','f3'不只是'2'或'3'。 – 2012-08-03 09:05:32

回答

2

你在索引時間用什麼分析?鑑於你的例子,你應該確保你的分析:

  • 確實lowercasing,
  • 不排除數字,
  • 沒有在字母和數字之間的界限劃分。
+0

我已經使用StopAnalyzer for索引。它確實降低,不會刪除數字。雖然我不確定這三點。但即使它會在字母和數字之間的邊界處分開,那麼當我僅使用數字(例如32)進行搜索時,它應該可以工作。不應該嗎? – Logan 2012-08-03 09:03:39

+0

我發現了這個問題。這是由於你提到的第三點。 'StopAnalyzer'使用'LetterTokenizer'來創建令牌,這會在字母和數字之間的邊界處破壞字符串。謝謝。 – Logan 2012-08-03 09:23:21

+0

但是,如果這樣做,它會不會存儲數字文字或將創建單獨的數字值的標記(例如32358)或將創建所有數值的單獨標記(例如3,2,3,5 8)? – Logan 2012-08-03 09:32:19

0

在上面說了Lucene FAQ頁面:

領先的通配符(例如* OOK)不被通過的QueryParser默認 支持。從Lucene 2.1開始,可以通過調用 QueryParser.setAllowLeadingWildcard(true)來啓用它們。請注意,這可能是 昂貴的操作:它需要完整掃描 索引中的標記列表,以查找與該模式匹配的標記列表。

有關更多信息,請here.

+0

我沒有使用QueryParser來解析查詢,其次,如果不支持前導通配符,那麼當我使用字符串* f *進行搜索時,我不應該得到任何結果,但這不是這種情況,只有當我使用整數或字符+整數時纔會出現問題 – Logan 2012-08-03 06:03:20

+0

對不起,誤解了你的問題 – 2012-08-03 07:31:02

+1

沒關係,謝謝你試圖幫助:) – Logan 2012-08-03 09:05:03