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

时间:2019-06-25 17:55:57

标签: java lucene wildcard hibernate-search case-insensitive

首先,这是我的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查询解析器语法发出自己的动态查询非常重要(如{{3}中所描述的那样) })

因此,当调用方以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();

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

1 个答案:

答案 0 :(得分:1)

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

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