私のアプリケーションでは、Hibernate Searchを使用して、マップされたモデル クラスの一部のLuceneインデックスを管理しています (10 個のクラスが部分的に相互に関連付けられてindexEmbedded
おり、インデックス定義にかなりの時間を費やしています)。約あります。1,500,000 ドキュメントのインデックス作成
インデックス全体を再構築するために、ドキュメント http://docs.jboss.org/hibernate/search/3.3/reference/en-US/html/manual-index-changes.htmlで提案されているように、マス インデクサーを使用します。
fullTextSession
.createIndexer()
.batchSizeToLoadObjects(200)
.cacheMode(CacheMode.IGNORE)
.purgeAllOnStart(true)
.threadsToLoadObjects(10)
.threadsForIndexWriter(10)
.threadsForSubsequentFetching(5)
.startAndWait();
データベース接続プールのサイズは 50 です
インデックス作成手順は、全ドキュメントの約 25% に達するまで、すぐに有望になることがわかりました。その後、パフォーマンスは大幅に低下します (次の 5% は最初の 25% の 2 倍の時間がかかります)。
- オブジェクト読み込みスレッドとインデックス作成スレッドの比率が間違っていませんか?
- それとも単にインデックスのサイズが大きくなったためですか? これは、このパフォーマンスの低下を正当化しますか?
- パフォーマンスを向上させる方法は?時間内に一定の進歩を遂げる方法は?
Hibernate Search に DB から検索結果をフェッチさせるのではなく、プロジェクションを使用しているため、インデックス化されたフィールドの多くは Index ( Store.YES
) に格納されます。これはパフォーマンスに大きな影響を与えますか?
- 編集:
私のHibernate検索構成:
properties.setProperty("hibernate.search.default.directory_provider", "filesystem");
properties.setProperty("hibernate.search.default.indexBase", searchIndexPath);
properties.setProperty("hibernate.search.indexing_strategy", "manual");
properties.setProperty("hibernate.default_batch_fetch_size", "200");