2017-04-03 246 views
0

我使用Spring JPA + Hibernate Search在我的應用程序中實現持久性和搜索。Spring JPA + Hibernate搜索:如何僅更新搜索索引(Lucene)?

我有模特這樣

public class FeatureMeta { 

    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Long id; 

    @Column(unique=true) 
    private String uri; 

    @Column 
    @Field 
    private String name; 

    @Field 
    @Column 
    private String businessDesc; 

    @Field 
    @Column 
    private String logicalDesc; 

    . 
    . 


    @Field 
    @Column(insertable=false,updatable=false) 
    private Long totalDownloads; 

    . 
    . 

} 

爲了讓這個類的想法,「FeatureMeta」保持其更新很少的元數據信息。

但是,無論何時用戶下載有關此「功能」的信息,字段「totalDownloads」都會不斷變化。 基本上「totalDownloads」不是元數據的一部分,但我必須將該字段放入模型中,因爲我需要在「特徵搜索」的搜索結果中顯示「totalDownloads」。

我使用相同的JPA Repository更新MySQL和Lucene索引。

我的問題是;只要更改「totalDownloads」字段,只能更新Lucene索引中的「totalDownloads」,而不更新MySQL中的實體嗎?

+0

不希望堅持這種下載次數的原因是什麼?它存儲在其他地方嗎?如果是這樣,你的元數據和存儲這些信息的其他地方是否有關係?如果你沒有堅持到任何地方,索引被破壞的那一天(它會*發生),你將無法在「totalDownloads」字段中使用正確的數據重建它們...... –

回答

1

您必須使用@Transient註釋來標記您不希望此屬性屬於數據庫模型的一部分。

@Field 
@Transient 
private Long totalDownloads; 

使字段過渡也意味着它不會從數據庫加載(完全被Hibernate ORM忽略,而不是Hibernate Search);如果這不是你想要的,你可以添加一個額外的字段:將一個映射到Hibernate ORM,另一個用Hibernate Search索引並用@Transient註釋。在這種情況下,你必須讓setter更新這兩個字段。

你可能會需要太多改變這個配置屬性:

hibernate.search.enable_dirty_check = false 

如Hibernate Search的,否則將不會產生Lucene索引的任何變化,如果實體有沒有其他變化。