gpt4 book ai didi

java - 用于索引和搜索的 Lucene 分析器

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:36:02 24 4
gpt4 key购买 nike

我有一个像这样用 Lucene 索引的字段:

@Field(name="hungerState", index=Index.TOKENIZED, store=Store.YES)
public HungerState getHungerState() {

此字段的可能值为 HUNGRY、SLIGHTLY_HUNGRY 和 NOT_HUNGRY

当使用 StandardAnalyzer 为这些值编制索引时,这些术语最终会变成hungry, slightly,因为它会标记标点符号并忽略“not”。

如果我将索引更改为 index=Index.UN_TOKENIZED,索引项将如预期的那样为 HUNGRY、SLIGHTLY_HUNGRY 和 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"的搜索,它会搜索 getSearchFields() 在 "foo"上返回的所有字段,以及 searchTerms 指定要搜索的字段和值的地方(即 "hungerState:HUNGRY ")

我的问题是后一种情况。由于查询解析器使用 StandardAnalyzer,搜索 hungerState:SLIGHTLY_HUNGRY 会被解析为 hungerState:"slightly hungry" 并搜索 hungerState=NOT_HUNGRY被解析为 hungerState=hungry

当使用 StandardAnalyzer 对该字段进行索引时,我得到了意外的结果(搜索 HUNGRY 和 NOT_HUNGRY 返回所有 3 个值的结果)。当该字段被索引为 UN_TOKENIZED 时,我没有得到任何结果,因为查询解析器标记了搜索字符串并将其变为小写。

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

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

最佳答案

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

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

您可能想要使用 PerFieldAnalyzerWrapper如果您的其他字段不是关键字。

关于java - 用于索引和搜索的 Lucene 分析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7744129/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com