我有我使用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
分析整個搜索字符串。
任何意見,將不勝感激。謝謝!
PerFieldAnalyzerWrapper正是我所需要的,因爲StandardAnalyzer適用於我所有的其他領域。 – schmimd04