我实现了一个自定义桥,它将所有动态字段与相关类型映射。类型可以是 FieldType.STRING 或 FieldType.DOUBLE 或 FieldType.BOOLEAN,具体取决于值。
当我查看弹性搜索架构上的映射时,所有字符串字段都使用 TEXT 类型映射,我希望它是一个关键字,以便我可以执行通配符 serach。
这是我的问题,我想为动态映射字段"属性.动态字段-1"过滤"AAA-VALUE">
我有一个索引值为"AAA-VALUE",用于动态映射字段"属性.动态字段-1">
如果我想进行关键字搜索,我遇到了诸如"找不到字段桥"之类的错误,然后我通过使用ignoreFieldBridge忽略桥来解决错误,并且错误消失了。
然后我再次尝试使用值为"AAA-VALUE"进行搜索,结果为空(未找到数据(。在这里,我使用 keyword(( 查询创建了查询。
然后我再次尝试进行短语查询,然后它得到了工作,但问题是我如何进行通配符搜索,例如">-VALUE"。
关于代码,我遵循了此处给出的类似实现 https://github.com/hibernate/hibernate-search/blob/master/legacy/engine/src/test/java/org/hibernate/search/test/bridge/MultiFieldMapBridge.java
在我的实现中,只有类型不同,其中类型可以是字符串、布尔值或双精度值。
我的休眠搜索版本 - 休眠搜索版本和休眠搜索弹性搜索 = 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