如何在 Hibernate Search 6 中的多个桥中重用一个字段?

How can I reuse a field in several bridges in Hibernate Search 6?

在 Hibernate Search 5 中,我有几个填充相同字段的自定义桥。这很方便,因此我可以只在一个字段上执行查询。现在,如果我尝试这样做,我会收到此错误:

HSEARCH600034: Duplicate index field definition: 'attributes'. Index field names must be unique. Look for two property mappings with the same field name, or two indexed-embeddeds with prefixes that lead to conflicting index field names, or two custom bridges declaring index fields with the same name.

我还没有找到在实现 PropertyBinder 时从 PropertyBinding 上下文获取现有字段的方法,只有记录的添加新字段的方法:

    IndexFieldReference<String> attributesField = schemaElement
            .field("attributes", f -> f.asString())
            .toReference();

我是否遗漏了什么或不再可能,我需要添加新字段?

How can I reuse a field in several bridges in Hibernate Search 6?

目前,您不能。

此限制是 Hibernate Search 6 在启动时执行的(许多)健全性检查的副作用,可防止常见错误并间接允许搜索 DSL 中的行为更直观。

您的选择大致如下:

  • 要么重构你的桥梁,将所有对同一领域有贡献的代码重新组合在一个桥梁中(TypeBridge,或者 PropertyBridge 应用于 non-persisted getter returns 您感兴趣的所有值的汇总列表)。
  • 或者你改变你的桥梁,让每个人都为自己的领域做出贡献,并改变你的搜索代码,同时定位所有这些领域;大多数(如果不是全部)谓词 allow targeting multiple fields in the same predicate.

第二种解决方案也是推荐的索引方式,因为它会产生更准确的相关性分数。

编辑:如果您选择解决方案 2,您可能会对这个(尚未实现的)功能感兴趣:https://hibernate.atlassian.net/browse/HSEARCH-3926