2012-10-16 84 views
2

的自動更新我有多個名稱相關的屬性(名字,姓氏,職務)一個人的實體。 所有與名稱相關的屬性都應存儲在單個lucene索引字段「fullName」中。Hibernate Search的組成領域

@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的全名即是由場的部分變化時,必須進行更新?也許這樣?

@ComposedOf({"firstName", "lastName", "title"}) 

謝謝!

回答

1
@Indexed 
@Entity 
public class Person { 
    ... 
    @Field(name="fullName") String firstName; 
    @Field(name="fullName") String lastName; 
    @Field(name="fullName") String title; 
} 

這是可能的,你選擇了切分,我假設你的分析儀設置爲你添加空格的令牌上的空白分裂將它們分開:你可以有一個相同的字段的多次重複,結果是幾乎一樣分裂複合詞 (我說的差不多,因爲它無法確定的情況下,術語的排序,你需要一個PhraseQuery尋找關鍵字的特定順序)。

對於更復雜的情況下,你可以使用一個ClassBridge它禁用髒檢查優化這已經討厭你在這種情況下:Hibernate Search的跟蹤如果任何持久字段被實際寫入,以決定是否可以跳過昂貴的重索引操作,但無法檢測到這些技巧。

+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。使用一流的橋樑也將自動禁用髒檢查優化
+0

不錯的選擇。我知道班級橋樑,但認爲他們會因爲我的簡單需要而有點矯枉過正。全局禁用髒檢查對我來說似乎有點矯枉過正。 我寧願索引所有其他領域,但最終與桑納斯解決方案。我也贊成你的回答。謝謝! –