Hibernate Search自动更新组合字段

时间:2012-10-16 10:51:50

标签: lucene hibernate-search

我有一个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"})

谢谢!

2 个答案:

答案 0 :(得分:3)

您的问题有几种解决方案,您选择的解决方案可能是品味问题(您也可以应用它们的组合):

  1. 检查属性_hibernate.search。enable_dirty_check_并确保在您的情况下将其设置为 false 。默认值为 true 。有关详细信息,请参阅在线文档 - http://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/
  2. 还将 @Field 注释添加到firstName,lastName和title。您获得更大的索引大小,但通常无关紧要。作为副作用,脏检查将起作用(假设你的JPA注释是正确的。例如我假设getFullName是瞬态的)
  3. 使用类桥接器并选择删除 getFullName 。使用类桥也将自动禁用脏检查优化

答案 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会跟踪是否有任何持久字段被写入以决定是否可以跳过昂贵的重建索引操作,但无法检测到这些技巧。