Hibernate搜索动态确定索引字段

时间:2016-02-23 15:41:00

标签: hibernate hibernate-search

我有一个如下所示的实体;字段到列的映射正在使用XML执行,因此在这里不可见。我正在使用Hibernate搜索来索引某些实体的某些字段,以及它们何时被修改。

@Indexed
public class DataObject extends AbstractEntity {    

    @DocumentId
    private Long id;
    ...

    @Field
    private String summary;

    @Field
    private String description;

    private Map<String, Object> extendedProperties;
}

现在,对于我使用注释启用搜索的属性,一切正常。

我使用extendedProperties允许将动态属性添加到DataObject。这些属性映射到&#34; jsonb&#34;输入PostgreSQL 9.4并存储为JSON对象。扩展属性是可配置的,配置将具有索引属性,该属性将确定是否应对属性建立索引。

我想要做的是在实体被插入或更新索引之前,将可搜索的属性及其值添加到EntityIndexBinding(我在调试Hibernate代码后到达此处)。有没有办法做到这一点,如果是这样的话?

1 个答案:

答案 0 :(得分:1)

到目前为止,这似乎有效......

@Indexed
public class DataObject extends AbstractEntity {    

    @DocumentId
    private Long id;
    ...

    @Field
    private String summary;

    @Field
    private String description;

    @Column(name = "extendedProperties")
    @Type(type = "StringJsonObject") // to map to PostgreSQL jsonb  
    @Field(name="", bridge = @FieldBridge( impl = ExtendedPropertyBridge.class))
    private Map<String, Object> extendedProperties;
}

public class ExtendedPropertyBridge implements FieldBridge {    

    @Override
    public void set(String name, Object value, Document document,
            LuceneOptions luceneOptions) {

        @SuppressWarnings("unchecked")
        Map<String, Object> map = (Map<String, Object>)value;
        for (String key : map.keySet()) {
            //TODO validate if key is searchable
            String val = map.get(key).toString();
            if (val != null) {
                luceneOptions.addFieldToDocument(key, val, document);
            }
        }
    }   
}

查询时我必须使用ignoreFieldBridge()选项。

  

参考

https://docs.jboss.org/hibernate/search/5.2/reference/en-US/html/search-mapping.html#search-mapping-bridge