2

Luceneインデックスの上に構築されたHibernateSearchを使用しています。データベーステーブルに対してインデックスを作成すると、結果を返す際のパフォーマンスが向上します。

私の質問は、インデックスが作成されたら、結果をクエリすると、Hibernate Searchは作成されたインデックスを使用して元のデータベーステーブルから結果をフェッチしますか?または、結果を取得するためにデータベースにアクセスする必要はありませんか?

ありがとう!

4

2 に答える 2

5

プロジェクションを使用しない限り、インデックスはクエリに一致する主キーのセットを識別するためにのみ使用され、データベースからエンティティをロードするために使用されます。

これには多くの理由があります。

  • ご指摘のとおり、すべてのデータをインデックスに保存するわけではありません。インデックスが大きいほど、インデックスは遅くなります。
  • 必要なすべてのメタデータをインデックスに追加すると、インデックス作成は非常にコストのかかる操作になります
  • インデックスからの値の抽出はまったく効率的ではありません。クエリは得意ですが、それ以上は得意ではありません。
  • リレーショナルデータベースは、主キーによるデータの読み込みに非常に優れています
  • DBが十分でない場合は、第2レベルのキャッシュが主キーによるロードに最適です。
  • DBからロードすることにより、特に非同期インデックスとの整合性を保証します
  • DBからロードすることにより、エンティティをトランザクションと分離に参加させることができます

ただし、完全に管理されたエンティティが必要ない場合は、プロジェクションを使用して、Stored.YESとして注釈を付けたフィールドをロードできます。一般的なパターンは、プロジェクションを使用して一致のプレビューを提供し、ユーザーがクリックして詳細を表示すると、その結果に一致する完全なエンティティをロードすることです。

于 2013-01-28T23:15:07.330 に答える
1

デフォルトでは、Hibernateを介してオブジェクトが挿入、更新、または削除されるたびに、HibernateSearchはドキュメントに従ってそれに応じたLuceneインデックスを更新します

したがって、さらに検索すると、luceneインデックスのみを介してデータが生成されます。

インデックスがどのように機能するかを説明する別の質問

于 2013-01-28T11:18:00.020 に答える