4

Hibernate Search と Hibernate アプリケーションの統合を開始しました。サーバーを起動するたびに、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 分かかります。私はこれを正しい方法でやっていますか?

インデックスを定期的に更新するスケジューラを作成しました。これにより、既存のインデックス エントリが自動的に更新されますか、それとも重複したインデックスが作成されますか?

4

3 に答える 3

10

Hibernate Search ガイドのセクション 3.6.1 で詳しく説明されているように、アノテーション (現在はデフォルト) を使用している場合、ストアでインデックス作成を開始するリスナーはデフォルトで登録されます。

Hibernate Annotations または Hibernate EntityManager を使用すると、Hibernate Search がすぐに有効になります。何らかの理由で無効にする必要がある場合は、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")

注釈を付けてから、ユーザー ガイドで詳しく説明されているように、フィールドにきめ細かい注釈を付けます。

したがって、インデックス作成が有効になる前に格納されたエンティティがない限り、保存時に手動でインデックス作成を起動したり、アプリケーションの起動時にインデックス作成を再起動したりしないでください。

「アタッチメント」があると言うオブジェクトを保存しているときにパフォーマンスの問題が発生する可能性があるため、エンティティを保存しているトランザクションの同じスコープでインデックスを作成しています。ここを参照してください:

Hibernate Search とオフライン テキスト抽出

この問題を解決するソリューションのために。

于 2009-09-17T11:16:50.823 に答える
1

FSDirectoryProvider (デフォルト) を使用している場合、Lucene インデックスはディスク上に保持されます。これは、起動時にインデックスを作成する必要がないことを意味します。もちろん、既存のデータベースがある場合は、 fullTextSession.index() 機能を使用して初期インデックスを作成する必要があります。ただし、これはアプリケーションの起動時であってはなりません。ある種のトリガー URL、または管理インターフェースを公開することを検討してください。初期インデックスを取得したら、自動インデックス作成を使用することをお勧めします。これは、ブックが作成/更新/削除されると、Lucene インデックスが自動的に更新されることを意味します。自動インデックス作成もデフォルトで有効にする必要があります。

オンラインマニュアルの自動および手動インデックス作成セクションを参照することをお勧めします - http://docs.jboss.org/hibernate/stable/search/reference/en/html_single

――ハーディー

于 2009-06-02T08:02:04.123 に答える
0

私は現在、JPAでHibernate Searchの自動インデックス作成を使用していますが、これは非常にうまく機能します。最初にインデックスを作成するには、次のように呼び出すことができます。

    FullTextEntityManager fullTextEntityManager = 
                    Search.getFullTextEntityManager(entityManager);

    try {
       fullTextEntityManager.createIndexer().startAndWait();
    } catch (InterruptedException e) {
       // Exception handling
    }

ここで、「entityManager」は単なるjavax.persistence.EntityManagerです。上記は、@ Indexedとしてマークされたすべてのエンティティについて、@Fieldでマークされたすべてのフィールドにインデックスを付けます。

次に、エンティティマネージャを介してすべての更新などを行う限り、インデックスは自動的に更新されます。その後、通常どおりに検索できますが、検索のたびに必ずEntityManagerを再作成してください(EntityManagerFactoryを使用して再作成できます)。

于 2011-02-10T03:19:10.633 に答える