有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用于索引和搜索的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) 个答案

  1. # 1 楼答案

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

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

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