我有一个正在使用 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 = "foo" 的搜索,它搜索由getSearchFields()
在“foo”上,以及 searchTerms 指定要搜索的字段和值的位置(即“hungerState:HUNGRY”)
我的问题是后一种情况。由于查询解析器使用 StandardAnalyzer,因此搜索hungerState:SLIGHTLY_HUNGRY
被解析为hungerState:"slightly hungry"
并搜索hungerState=NOT_HUNGRY
被解析为hungerState=hungry
.
当使用 StandardAnalyzer 对该字段进行索引时,我得到了意外的结果(搜索 HUNGRY 和 NOT_HUNGRY 返回所有 3 个值的结果)。当字段索引为 UN_TOKENIZED 时,我不会得到任何结果,因为查询解析器对搜索字符串进行标记并使其小写。
我什至尝试指定一个分析器来进行索引,例如KeywordAnalyzer
,但它几乎没有任何效果,因为整个搜索字符串都是用StandardAnalyzer
每次。
任何意见,将不胜感激。谢谢!