我有我使用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