2017-03-05 51 views
0

而索引在Lucene中,我創建的文件如下:Lucene的搜索不會顯示預期的輸出

Document document = new Document(); 



     Field fileNameField = new Field("name", 
     name, 
     Field.Store.YES,Field.Index.ANALYZED); 

     Field filePathField = new Field("code", 
     code, 
     Field.Store.YES,Field.Index.NOT_ANALYZED); 


     document.add(fileNameField); 
     document.add(filePathField); 

我試圖做name字段搜索。 這個名字有國家的名單。

這是查詢分析器:

queryParser = new QueryParser(Version.LUCENE_36, 
     "name", 
     new StandardAnalyzer(Version.LUCENE_36)); 
query = queryParser.parse(searchQuery); 

當我通過搜索文本爲「中」我希望得到匹配的結果,如印度,印尼等... 但結果都是空的。 這只是做精確匹配。 當我通過印度整個詞,我得到的答覆其他零結果。

什麼是可能的解決方案,以獲得匹配結果不準確。前者爲 。即使是「dia」字樣也應該給出如印度等的迴應。

回答

2

這裏有很多問題。我假設,您正在索引StandardAnalyzer。如果沒有,請在評論中糾正我。

  1. Lucene StandardAnalyzer合併了一個StopFilter與英文單詞列表。該清單肯定包含麥汁「in」。所以當你查詢「in」時,它會在它達到索引之前被過濾掉。
  2. 術語「in」不在索引中,因爲StandardTokenizer未在單詞內分割。您可以使用通配符搜索(「in *」)使用索引標記「india」進行匹配,但這不會與「dia」一起使用,因爲查詢開始時不允許使用通配符。

如果您想擺脫這兩個問題,您可能需要使用NGramTokenizer。它不作用於停用詞並將給定單詞的所有n元作爲標記進行索引。閱讀更多關於它here

+0

嘿謝謝sven。如果我想只匹配ind,indi ......等開始字符,而不是來自印度的「dia」。哪個標記器會很好。 – ashwinbhy

+0

如果您想從頭開始匹配,可以使用通配符進行搜索,如'ind *'。 'StandardTokenizer'對此很好。 –