我有一个如下所示的实体;字段到列的映射正在使用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代码后到达此处)。有没有办法做到这一点,如果是这样的话?
答案 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()选项。
参考