我有一个字段,我正在使用Lucene索引:
@Field(name="hungerState", index=Index.TOKENIZED, store=Store.YES)
public HungerState getHungerState() {
此字段的可能值为HUNGRY, SLIGHTLY_HUNGRY, and NOT_HUNGRY
当使用StandardAnalyzer
对这些值编制索引时,这些字词最终为hungry, slightly
,因为它会在标点符号上进行标记并忽略“not”。
如果我将索引更改为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 =“foo”的搜索,搜索“{1}”在“foo”上返回的所有字段,以及searchTerms指定要搜索的字段和值(即“hungerState:HUNGRY”)
我的问题是后一种情况。由于查询解析器使用的是StandardAnalyzer,因此搜索getSearchFields()
会被解析为hungerState:SLIGHTLY_HUNGRY
,搜索hungerState:"slightly hungry"
会被解析为hungerState=NOT_HUNGRY
。
当使用StandardAnalyzer对字段进行索引时,我会得到意外的结果(搜索HUNGRY和NOT_HUNGRY会返回所有3个值的结果)。当字段被索引为UN_TOKENIZED时,我没有得到任何结果,因为查询解析器将搜索字符串标记化并使其为小写。
我甚至尝试将分析器指定为hungerState=hungry
之类的索引,但由于每次都使用KeywordAnalyzer
分析整个搜索字符串,因此它几乎无效。
任何建议都将不胜感激。谢谢!
答案 0 :(得分:2)
您正在为查询解析器使用标准分析器,因此您的查询将使用标准分析器进行分析。只需切换到使用关键字分析器:
MultiFieldQueryParser parser = new MultiFieldQueryParser(Version.LUCENE_30, getSearchFields(),
new KeywordAnalyzer(Version.LUCENE_30));
如果您的其他字段不是关键字,则可能需要使用PerFieldAnalyzerWrapper。