gpt4 book ai didi

java - Hibernate-Search - 使用 lucene 查询解析器语法进行不区分大小写的通配符搜索(不使用 QueryBuilder!)

转载 作者:行者123 更新时间:2023-11-30 05:35:23 25 4
gpt4 key购买 nike

首先,这是我的 Hibernate-Search 索引时间设置:

// ...
@Indexed(index = "XXXRequestIndex")
@AnalyzerDef(name = "toLowercaseAnalyzer",
tokenizer = @TokenizerDef(factory = KeywordTokenizerFactory.class),
filters = {
@TokenFilterDef(factory = LowerCaseFilterFactory.class)
})
public class XXXRequest implements Serializable {
// ...
@Field(analyze = Analyze.YES, store = Store.YES, analyzer = @Analyzer(definition = "toLowercaseAnalyzer"))
@SortableField
private String status;
// ...
}

我看到这个线程,其中 .overridesForField(...) 在查询时的字段的 QueryBuilder 上设置,以便使用通配符查询不区分大小写: Hibernate Search | ngram analyzer with minGramSize 1

我只需要对特定字段(“状态”)执行类似的操作,但我使用QueryBuilder,而是解析传入的 lucene 查询使用 MultiFieldQueryParser 的字符串。我无法更改它以切换为使用 QueryBuilder 构建查询,因为代码的调用者使用 lucene 查询解析器语法发出自己的动态查询非常重要(如 https://lucene.apache.org/core/2_9_4/queryparsersyntax.html 中或多或少描述的那样) )

因此,当调用者作为 lucene 查询发送 status:*n\Pr* 时,它与“正在处理”不匹配。但是,像 status:*n\pr* 这样的查询确实匹配“正在处理”。

我的查询代码:

Analyzer analyzer = new KeywordAnalyzer();
String[] fields = ...
MultiFieldQueryParser queryParser = new MultiFieldQueryParser(
fields,
analyser);

Query luceneQuery = queryParser.parse(luceneFilterString);
List results = fullTextQuery.getResultList();

如何使查询不区分大小写?

最佳答案

MultiFieldQueryParser 不会分析通配符搜索,因此您必须自己进行过滤(因此您需要手动将过滤器应用于输入字符串)。

另一种选择是使用简单查询字符串功能(请参阅 https://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#_simple_query_string_queries ),它可以对此类查询应用分析,但它仅支持前缀查询(因此您可以搜索 process* 但不是*cessing)。如果您可以接受这个限制,我真的推荐这种方法。

关于java - Hibernate-Search - 使用 lucene 查询解析器语法进行不区分大小写的通配符搜索(不使用 QueryBuilder!),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56759614/

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