1

現在の設定は、Spring Data JPAによる主なデータソースとしてMySQLであり、Hibernate Searchでデータのインデックスと検索を行います。私たちはElastic Searchを利用して、他の機能との連携を強化するための検索を行うことにしました。複数のサーバーでインデックス作成と検索を共有する必要があります。バッチインデックス付けSpringデータからElasticSearchへのJPAエントリ

私は、データインデックス作成と検索のためのSpring Data ElasticSearchを使用して、ElasticsearchRepositoryからElasticを設定することができます。しかし、今の課題は、既存のすべてのMySQLレコードをElastic Searchにインデックスする方法です。 Hibernate Searchはこれを行うためのAPIを提供しています。常に使用しているorg.hibernate.search.jpa.FullTextEntityManager#createIndexerです。しかし、私はSpring Data ElasticSearch内で便利なソリューションを見つけることができません。誰かが私をここで助けたり、いくつかの指針を提供してくれることを願っています。

similar question hereがありますが、提案されている解決法は、複数のDBテーブルにマップされたオブジェクト全体をインデックスできるようにするため、私のニーズに合っていません。

+0

エンティティを1:1に保存するか、検索を最適化する(つまり結合を取り除くなど)ために、一部を「平坦化」する必要がありますか? – Val

+0

私は1:1と言います。私のコードでは、私はESの文書としてインデックスの1つのエンティティです。そのため、主に私のシナリオにはきれいな解決策があると思われます。しかし、そのエンティティは、親エンティティ、リレーションシップ、コレクションメンバーなどのために、DB内の複数のテーブルにマップされています。私は現在モバイルになっていますので、必要に応じてコードサンプルを提供することはできません。 – Derek

答えて

1

これまで罰金、私は自分のアプリケーション内でESにインデックスにすべてのJPAエントリを私自身のコードを書くよりも、よりよい解決策を見つけていない、そしてこの1つは私のために働い

Pageable page = new PageRequest(0, 100); 
Page<Instance> curPage = instanceManager.listInstancesByPage(page); //Get data by page from JPA repo. 
long count = curPage.getTotalElements(); 
while (!curPage.isLast()) { 
    List<Instance> allInstances = curPage.getContent(); 
    for (Instance instance : allInstances) { 
     instanceElasticSearchRepository.index(instance); //Index one by one to ES repo. 
    } 
    page = curPage.nextPageable(); 
    curPage = instanceManager.listInstancesByPage(page); 
} 

ロジックは非常に簡単ですデータの量に応じてしばらく時間がかかる可能性がありますので、バッチを分割してメッセージを追加すると便利です。

関連する問題