用于索引和搜索的Lucene Analyzer

时间:2011-10-12 17:33:41

标签: java hibernate lucene hibernate-search

我有一个字段,我正在使用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分析整个搜索字符串,因此它几乎无效。

任何建议都将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:2)

您正在为查询解析器使用标准分析器,因此您的查询将使用标准分析器进行分析。只需切换到使用关键字分析器:

MultiFieldQueryParser parser = new MultiFieldQueryParser(Version.LUCENE_30, getSearchFields(), 
          new KeywordAnalyzer(Version.LUCENE_30));

如果您的其他字段不是关键字,则可能需要使用PerFieldAnalyzerWrapper