Java 用于索引和搜索的Lucene分析器

Java 用于索引和搜索的Lucene分析器,java,hibernate,lucene,hibernate-search,Java,Hibernate,Lucene,Hibernate Search,我有一个用Lucene索引的字段,如下所示: @Field(name="hungerState", index=Index.TOKENIZED, store=Store.YES) public HungerState getHungerState() { 此字段的可能值为饥饿、稍微饥饿和不饥饿 当使用StandardAnalyzer对这些值进行索引时,这些术语最终会被称为饥饿,因为它会在标点符号上标记,并忽略“not” 如果我将索引更改为index=index.UN\u标记化,则索引项将如预期

我有一个用Lucene索引的字段,如下所示:

@Field(name="hungerState", index=Index.TOKENIZED, store=Store.YES)
public HungerState getHungerState() {
此字段的可能值为
饥饿、稍微饥饿和不饥饿

当使用
StandardAnalyzer
对这些值进行索引时,这些术语最终会被称为
饥饿,因为它会在标点符号上标记,并忽略“not”

如果我将索引更改为
index=index.UN\u标记化
,则索引项将如预期的那样是
饥饿、稍微饥饿和不饥饿

我的搜索API有一个“搜索”方法,它构造了
查询
,如下所示:

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”的搜索,它搜索由“foo”上的
getSearchFields()
返回的所有字段,并且searchTerms指定要搜索的字段和值(即“hungerState:Hunger”)

我的问题是后一种情况。由于查询解析器使用的是StandardAnalyzer,因此搜索
饥饿状态:稍微饥饿
解析为
饥饿状态:“稍微饥饿”
并搜索
饥饿状态=不饥饿
解析为
饥饿状态=饥饿

当使用StandardAnalyzer为字段编制索引时,我会得到意外的结果(搜索所有3个值的饥饿和不饥饿返回结果)。当字段被索引为unu标记化时,我不会得到任何结果,因为查询解析器将搜索字符串标记化并使其小写

我甚至尝试过为索引指定一个分析器,比如
KeywordAnalyzer
,但几乎没有效果,因为每次都使用
StandardAnalyzer
分析整个搜索字符串


如有任何建议,将不胜感激。谢谢

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

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

如果您的其他字段不是关键字,您可能需要使用。PerfielDanalyzerRapper正是我需要的,因为StandardAnalyzer适用于我的所有其他字段。