2017-04-03 8 views
0

Spring JPA + Hibernate Searchを使用して、アプリケーションで永続性と検索を実装します。Spring JPA + Hibernate Search:検索インデックス(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"はメタデータの一部ではありませんが、 "feature search"の検索結果に "totalDownloads"を表示する必要があるため、このフィールドをモデルに入れる必要がありました。

MySQLとLuceneの両方のインデックスを更新するのと同じJPAリポジトリを使用します。

私の質問は、 Luceneインデックスの "totalDownloads"を更新するだけで、 "totalDownloads"フィールドが変更されたときはいつでもMySQLのエンティティを更新することはできますか?

+0

このダウンロード数を維持したくない理由は何ですか?それは他の場所に保管されていますか?もしそうなら、あなたのメタデータと、この情報が格納されているこの他の場所との間に、いくつかの関係リンクがありますか?あなたがインデックスを壊してしまった(そしてそれが起こることができる)日にちをどこにでも残さないと、 "totalDownloads"フィールドに正しいデータでそれらを再構築する方法がありません... –

答えて

1

この属性をデータベースモデルの一部にしたくないという印を付けるには、@ Transientアノテーションを使用する必要があります。

@Field 
@Transient 
private Long totalDownloads; 

フィールドトランジエントを作成すると、データベースからロードされないことも意味します(Hibernate ORMでは完全に無視されますが、Hibernate Searchでは完全に無視されます)。それがあなたが意図したものでない場合、追加のフィールドを追加することができます:1つをHibernate ORMにマップし、もう1つをHibernate Searchでインデックス付けし、@Transientで注釈を付けます。この場合、セッターは両方のフィールドを更新する必要があります。

あなたはおそらくあまりにもこの構成プロパティを変更する必要があります:

hibernate.search.enable_dirty_check = false 

エンティティがその他の変更を持っていない場合には休止状態の検索がそうでなければ、Luceneインデックスの変化を生成しませんよう。

関連する問題