繁体   English   中英

休眠搜索:无法对动态映射的字段文本字段进行通配符搜索

[英]Hibernate search: Cannot do a wild card search on a dynamically mapped field text fields

我已经实现了一个自定义桥,它映射了所有具有相关类型的动态字段。 根据值,类型可以是 FieldType.STRING 或 FieldType.DOUBLE 或 FieldType.BOOLEAN。

当我查看我的弹性搜索模式上的映射时,所有字符串字段都映射为 TEXT 类型,我希望它是一个关键字,以便我可以进行通配符搜索。

这是我的问题,我想为动态映射字段“attribute.dynamic-field-1”过滤“AAA-VALUE”

对于动态映射字段“attribute.dynamic-field-1”,我有一个索引值为“AAA-VALUE”

如果我想进行关键字搜索,我会遇到诸如“未找到字段桥”之类的错误,然后我通过使用 ignoreFieldBridge 忽略桥来解决该错误,并且错误消失了。

然后我再次尝试使用值为“AAA-VALUE”的搜索结果为空(未找到数据)。 在这里,我使用 keyword() 查询创建了查询。

然后我再次尝试进行短语查询然后它起作用了,但问题是我如何进行像“ -VALUE ”这样的通配符搜索。

关于代码,我遵循了此处给出的类似实现https://github.com/hibernate/hibernate-search/blob/master/legacy/engine/src/test/java/org/hibernate/search/test/bridge/MultiFieldMapBridge。爪哇

我的实现中只有类型不同,其中类型可以是字符串、布尔值或双精度值。

我的休眠搜索版本- hibernate-search.version 和 hibernate-search-elasticsearch = 5.11.3.Final

在进行以下更改后,它开始工作了。

这是我之前添加字段的方式

public class MultiFieldMapClassBridge implements MetadataProvidingFieldBridge {
;
;
;
luceneOptions.addFieldToDocument( fieldPrefix + "." + key, value, document );

}

但应按如下方式添加字段。

public class MultiFieldMapClassBridge implements MetadataProvidingFieldBridge {
;
;
org.apache.lucene.document.Field field = new org.apache.lucene.document.StringField(fieldPrefix + "." + key, value,  luceneOptions.getStore());
document.add(field);
}

我写的通配符查询如下

queryBuilder.keyword().wildcard().onField(prefixedPath).ignoreFieldBridge().matching(String.format("*%s*", matchingString.toLowerCase(Locale.getDefault()))).createQuery();

在阅读此文档后,我意识到了这一点,其中类桥必须将字段添加为 StringField。 https://docs.jboss.org/hibernate/search/5.5/reference/en-US/html_single/#example-class-bridge

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM