2011-10-12 44 views
3

我有我使用Lucene索引像這樣一個領域:Lucene的分析器進行索引和搜索

@Field(name="hungerState", index=Index.TOKENIZED, store=Store.YES) 
public HungerState getHungerState() { 

該字段的可能值是HUNGRY, SLIGHTLY_HUNGRY, and NOT_HUNGRY

當這些值是使用StandardAnalyzer索引,這些條款最終成爲hungry, slightly,因爲它在標點符號上標記並忽略「不」。

如果我將索引更改爲index=Index.UN_TOKENIZED,索引條目爲HUNGRY, SLIGHTLY_HUNGRY, and NOT_HUNGRY,如預期。

我的搜索API有1個「搜索」的方法構建Query像這樣:

MultiFieldQueryParser parser = new MultiFieldQueryParser(Version.LUCENE_30, getSearchFields(), new StandardAnalyzer(Version.LUCENE_30)); 
parser.setDefaultOperater(QueryParser.AND_OPERATOR); 
Query query = parser.parse(searchTerms); 

該處理的搜索,其中searchTerms =「富」,其搜索由getSearchFields()的「富」返回的所有領域,也searchTerms指定要搜索的字段和值(即「飢餓狀態:HUNGRY」)

我的問題是與後一種情況。由於查詢解析器使用的是StandardAnalyzer,因此將搜索hungerState:SLIGHTLY_HUNGRY解析爲hungerState:"slightly hungry",並將搜索hungerState=NOT_HUNGRY解析爲hungerState=hungry

當使用StandardAnalyzer對字段進行索引時,會得到意想不到的結果(搜索HUNGRY和NOT_HUNGRY會爲所有3個值返回結果)。當字段被索引爲UN_TOKENIZED時,我沒有得到任何結果,因爲查詢解析器將搜索字符串標記爲小寫並使其成爲小寫。

我甚至已經嘗試過指定分析器來編制索引,如KeywordAnalyzer,但它幾乎沒有效果,因爲每次都會用StandardAnalyzer分析整個搜索字符串。

任何意見,將不勝感激。謝謝!

回答

2

您正在爲查詢解析器使用標準分析器,因此您的查詢將使用標準分析器進行分析。只是切換到使用關鍵字分析儀:

MultiFieldQueryParser parser = new MultiFieldQueryParser(Version.LUCENE_30, getSearchFields(), 
      new KeywordAnalyzer(Version.LUCENE_30)); 

您可能需要使用一個PerFieldAnalyzerWrapper如果你的其他字段不是關鍵字。

+0

PerFieldAnalyzerWrapper正是我所需要的,因爲StandardAnalyzer適用於我所有的其他領域。 – schmimd04