Hibernateは検索でインデックスデータ
-
06-09-2019 - |
質問
私はちょうど私のHibernateのアプリケーションを使ったHibernate Searchを統合し始めました。データは、HibernateのSession私は、サーバーを起動するたびに使用してインデックスされます。
FullTextSession fullTextSession = Search.getFullTextSession(session);
Transaction tx = fullTextSession.beginTransaction();
List books = session.createQuery("from Book as book").list();
for (Book book : books) {
fullTextSession.index(book);
}
tx.commit(); //index is written at commit time
これは非常に厄介であり、サーバの起動に10分かかります。 私は、正しい方法でこれをやっているか?
私は定期的にインデックスを更新するスケジューラを書きました。このアップデートは、既存のインデックスエントリに自動的に、または重複したインデックスを作成するのでしょうか?
解決
にHibernate Searchは、外に有効になっています ボックスは、Hibernateアノテーションを使用する場合 またはEntityManagerを休止。ため、もし あなたはそれを無効にする必要があるいくつかの理由で、 セットする hibernate.search.autoregister_listeners falseにます。
手でそれらをオンにする方法の例:
hibConfiguration.setListener("post-update", new FullTextIndexEventListener());
hibConfiguration.setListener("post-insert", new FullTextIndexEventListener());
hibConfiguration.setListener("post-delete", new FullTextIndexEventListener());
あなたがを使用して索引付けしたエンティティに注釈を付けるするだけです。
@Indexed(index = "fulltext")
その後、注釈、およびユーザーガイドで説明するように、フィールド上のきめの細かい注釈を行います。
保存するときは、どちらもリニューアルインデックス、手でインデックス作成を起動するべきではありませんどちらもだからwhaeアプリケーションが起動し、索引付けが有効になっていた前に保存されているエンティティを持っている場合を除きます。
あなたが「添付ファイル」を持っているので、あなたはエンティティを記憶しているトランザクションの同じスコープでそれをインデックスしていると言うのオブジェクトを格納しているときには、パフォーマンスの問題を得ることができます。ここで参照してください。
にHibernate Searchとオフラインのテキスト抽出する
この問題を解決解決のため。
他のヒント
あなたはLuceneインデックスがディスク上に保持されます(デフォルト)FSDirectoryProviderを使用して提供されます。これは非常に起動時にインデックスする必要がないことを意味します。既存のデータベースを持っている場合は、fullTextSession.index()機能を使用して、最初のインデックスを作成することはもちろんたいです。しかし、これは、アプリケーションの起動時にすべきではありません。トリガーのURL、または管理インターフェイスのいくつかの並べ替えを暴露することを検討してください。 あなたが最初のインデックスを持っていたら、私は自動的にインデックスを使用することをお勧めします。これは、ブックが削除/更新/作成されます場合はLuceneインデックスは自動的に更新されることを意味します。自動索引もデフォルトで有効にする必要があります。
私はあなたがオンラインマニュアルの自動および手動インデックスのセクションを参照してくださいお勧めします - <のhref =「http://docs.jboss.org/hibernate/stable/search/reference/en/html_single」のrel = "nofollowをnoreferrer "> http://docs.jboss.org/hibernate/stable/search/reference/en/html_single の
- ハーディ
私は現在、JPAとHibernateの検索の自動インデックスを使用して、それは本当によく働きます。あなたのインデックスを作成するには、最初にあなただけの次を呼び出すことができます:
FullTextEntityManager fullTextEntityManager =
Search.getFullTextEntityManager(entityManager);
try {
fullTextEntityManager.createIndexer().startAndWait();
} catch (InterruptedException e) {
// Exception handling
}
ここで、 "EntityManagerが" ちょうどjavax.persistence.EntityManagerです。すべてのフィールドは、すべてのエンティティのため@Fieldでマークされた上記の意志指数は@Indexedとしてマークされます。
そして、限り、あなたはすべてのあなたのアップデートなどがそうであるように、エンティティマネージャを介してインデックスが自動的に更新されます。次に、(あなたがそうするのEntityManagerFactoryを使用することができます)通常通り検索しますが、各検索であなたのEntityManagerを再現することを確認することができます。