Hibernate Search 动态确定索引字段
Hibernate Search Dynamically Determine Indexed Fields
我有一个如下所示的实体;正在使用 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
。这些属性映射到 PostgreSQL 9.4 中的 "jsonb" 类型,并存储为 JSON 对象。扩展属性是可配置的,配置将有一个 属性 indexed 来确定 属性 是否应该被索引。
我想要做的是在插入或更新实体索引之前将可搜索属性及其值添加到 EntityIndexBinding(我在调试 Hibernate 代码后到达此处)。有没有办法做到这一点,如果有,怎么做?
到目前为止这似乎有效...
@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() 选项。
Reference
我有一个如下所示的实体;正在使用 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
。这些属性映射到 PostgreSQL 9.4 中的 "jsonb" 类型,并存储为 JSON 对象。扩展属性是可配置的,配置将有一个 属性 indexed 来确定 属性 是否应该被索引。
我想要做的是在插入或更新实体索引之前将可搜索属性及其值添加到 EntityIndexBinding(我在调试 Hibernate 代码后到达此处)。有没有办法做到这一点,如果有,怎么做?
到目前为止这似乎有效...
@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() 选项。
Reference