我有一个Person实体,它有多个与名称相关的属性(firstName,lastName,title)。 所有与名称相关的属性都应存储在单个lucene索引字段“fullName”中。
@Indexed
@Entity
public class Person {
...
private String firstName;
private String lastName;
private String title;
@Field(store=Store.NO, index=Index.TOKENIZED)
public String getFullName() {
return firstName + " " + lastName + " " + title;
}
}
我面临的唯一问题是在更新名称相关属性时自动更新索引中的fullName。
有没有办法告诉Hibernate Search fullName是一个组合字段,当其中一个部分发生变化时必须更新?也许是这样的?
@ComposedOf({"firstName", "lastName", "title"})
谢谢!
答案 0 :(得分:3)
您的问题有几种解决方案,您选择的解决方案可能是品味问题(您也可以应用它们的组合):
答案 1 :(得分:1)
@Indexed
@Entity
public class Person {
...
@Field(name="fullName") String firstName;
@Field(name="fullName") String lastName;
@Field(name="fullName") String title;
}
这是可能的,因为你选择了TOKENIZED并且我假设你的分析器被设置为在空格上分割标记,因为你要添加空格来分隔它们:你可以多次重复同一个字段,结果差不多与分割复合词相同 (我说几乎是因为如果你需要PhraseQuery寻找特定的关键字顺序,它将无法确定术语的排序。)
对于更复杂的情况,你会使用 ClassBridge 来禁用脏检查优化,在这种情况下你一直很烦恼:Hibernate Search会跟踪是否有任何持久字段被写入以决定是否可以跳过昂贵的重建索引操作,但无法检测到这些技巧。