首先,这是我的休眠搜索索引时间设置:
// ...
@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
,以便使用通配符查询不区分大小写: 休眠搜索 |ngram 分析仪,最小克大小为 1
我只需要对特定字段("状态")做类似的事情,但我没有使用QueryBuilder
,而是使用MultiFieldQueryParser
解析传入的 lucene 查询字符串。我无法将其更改为使用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
)。如果您可以接受此限制,我真的推荐这种方法。