用于索引和搜索的java Lucene分析器
我有一个用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有一个“search”方法,它构造了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”中的搜索,其中searchTerms=“foo”搜索由“foo”上的getSearchFields()
返回的所有字段,并且searchTerms指定要搜索的字段和值(即“饥饿状态:饥饿”)
我的问题是后一种情况。由于查询解析器使用的是StandardAnalyzer,因此搜索hungerState:SLIGHTLY_HUNGRY
将被解析为hungerState:"slightly hungry"
,搜索hungerState=NOT_HUNGRY
将被解析为hungerState=hungry
当使用StandardAnalyzer为字段编制索引时,我会得到意外的结果(搜索所有3个值的饥饿和不饥饿返回结果)。当字段被索引为unu标记化时,我不会得到任何结果,因为查询解析器将搜索字符串标记化并使其小写
我甚至尝试过为KeywordAnalyzer
之类的索引指定一个分析器,但几乎没有效果,因为每次都使用StandardAnalyzer
分析整个搜索字符串
如有任何建议,将不胜感激。谢谢
# 1 楼答案
您的查询解析器使用的是标准分析器,因此您的查询将使用标准分析器进行分析。只需切换到使用关键字分析器:
如果其他字段不是关键字,则可能需要使用PerFieldAnalyzerWrapper