java - Hibernate Search - 通配符和空格
问题描述
我正在使用带有多个单词/字段的 Hibernate Search,它可以按预期工作,直到我启用通配符。这是我的实体分析器:
@AnalyzerDef(name = "autocompleteAnalyzer",
tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
filters = {
// remove accents
@TokenFilterDef(factory = ASCIIFoldingFilterFactory.class),
// lower case
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
// Start with same root
@TokenFilterDef(
factory = SnowballPorterFilterFactory.class,
params = { @Parameter(name = "language", value = "English") })
})
这是我的查询:
if(criteria.length() > 0) {
fullTextQuery = queryBuilder
.keyword()
// .wildcard() => not in use
.onFields("firstName", "lastName", "extraName", "biography")
.matching(criteria)
.createQuery();
场景 01
如果我搜索“John Smith”之类的内容,我会得到以下查询:
+((firstName:john firstName:smith)
(lastName:john lastName:smith)
(extraName:john extraName:smith)
(biography:john biography:smith))
找到任何名为 John 或 Smith 的人。
场景 02 如果我搜索“John*”,因为我想找到名字以 John (Johnny, Johson) 开头的任何人,我需要启用通配符,如下所示:
fullTextQuery = queryBuilder
.keyword()
.wildcard()
当我通过返回以下查询键入“John*”时,它会起作用:
+(firstName:john* lastName:john* extraName:john* biography:john*)
但是当我输入“John* Smith”之类的内容时它不再起作用,因为它不会拆分单词,我认为这是由于通配符选项:
+(firstName:john* smith lastName:john* smith extraName:john* smith biography:john* smith)
解决方案
关键字查询将始终匹配包含任何提供的关键字的文档。通配符查询不应用分析。因此,两者都不适合您的情况。
使用 simpleQueryString 查询,并强制默认运算符为“and”:
fullTextQuery = queryBuilder
.simpleQueryString()
.onFields("firstName", "lastName", "extraName", "biography")
.withAndAsDefaultOperator()
.matching(criteria)
.createQuery();
推荐阅读
- excel - 如何读取与在一系列单元格(excel)中输入的文件名匹配的同一文件夹中的每个文件?并对所有文件执行相同的操作?
- git - 如何防止使用 husky 直接提交到 master 分支?
- php - 忽略标点符号并突出显示给定字符串中的模式
- r - SQL 查询无法识别的唯一标识符
- java - Java Mockito - 在 DocumentBuilder.parse 期间无法抛出 IOException
- css - 设置 div 的高度,使其延伸到页面的最后,只使用 css?
- c++ - 从远程客户端应用程序控制在嵌入式设备上运行的 Qt/C++/QML GUI 应用程序?
- json - 如何使用 Spark 中的数据框将一些 JSON 属性转换为行
- python - Fabric 2:为各种主机配置 sudo 密码
- javascript - 如何使用输入元素删除数组?