【发布时间】:2020-03-14 07:27:06
【问题描述】:
使用带有编程 API(无注释)的 Hibernate Search 5.11.3,有没有办法对添加到类或字段桥中的动态字段进行分面?使用 MetadataProvidingFieldBridge 时,我在 FieldMetadataBuilder 中看不到任何“方面”配置。
我在 set() 方法中尝试了 luceneOptions.addSortedDocValuesFieldToDocument() 和 luceneOptions.addFieldToDocument() 的各种组合。这成功更新了索引,但我无法执行方面查询。
我正在尝试做一个基本的属性方面/过滤器,其中我有一个通用的属性表,其中包含与产品关联的 id/name 和属性值。由于各种原因,我正在使用编程 API,尤其是对于我无法使用 @Facet 注释的属性。所以对于一个产品,我在 Product.class 中添加了这个类桥:
public class ProductClassTagValuesBridge implements FieldBridge
{
@Override
public void set(String name, Object value, Document document, LuceneOptions luceneOptions)
{
Product product = (Product) value;
for (TagValue v : product.getTagValues())
{
Tag tag = v.getTag();
String tagName = "tag-" + tag.getId();
String tagValue = v.getId().toString();
// not sure if this line is required? Have tried with and without
luceneOptions.addFieldToDocument(tagName, tagValue, document);
luceneOptions.addSortedDocValuesFieldToDocument(tagName, tagValue, document);
}
}
}
然后我构建我的(测试)分面请求来搜索 tag-56(我使用 Luke 确认在索引中):
FacetParameterContext context = queryBuilder.facet()
.name("tag-56")
.onField("tag-56")
.discrete();
FacetingRequest facetingRequest = context.createFacetingRequest();
在 search/FacetManager 中使用时会出现错误:
org.hibernate.search.exception.SearchException:HSEARCH000268:Facet request 'TAG_56' 尝试在字段 'tag-56' 上设置 facet,该字段要么不存在,要么未配置为 facet(通过 @Facet)。检查您的配置。
我还尝试了这篇文章中解决方案的自定义配置解决方案:Hibernate Search: configure Facet for custom FieldBridge
对于自定义字段,我在产品的 tagValues 中添加了一个字段桥。发生同样的错误。
mapping.entity(Product.class).indexed()
.property("tagValues", ElementType.FIELD).field()
.analyze(Analyze.NO).store(Store.YES)
.bridge(ProductTagValuesFieldBridge.class)
【问题讨论】:
标签: java hibernate lucene hibernate-search