2011-10-12 64 views
3

我有我使用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分析整个搜索字符串。

任何意见,将不胜感激。谢谢!

回答

2

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

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

您可能需要使用一个PerFieldAnalyzerWrapper如果你的其他字段不是关键字。

+0

PerFieldAnalyzerWrapper正是我所需要的,因为StandardAnalyzer适用于我所有的其他领域。 – schmimd04