14.3.5. クエリープロセスの最適化
クエリーのパフォーマンスは、以下の基準に依存します。
- Lucene クエリー。
- 読み込まれたオブジェクト数: ページネーション (常時) またはインデックス処理 (必要な場合) を使用します。
- Hibernate Search が Lucene リーダーと対話する方法: 適切なリーダーストラテジーを定義します。
- インデックスから頻繁に抽出された値をキャッシュします。「インデックス値のキャッシュ: FieldCache」 を参照してください。
14.3.5.1. インデックス値のキャッシュ: FieldCache
Lucene インデックスの主な機能は、クエリーへの一致を識別することです。クエリーが実行された後に、結果が分析され、有用な情報が抽出される必要があります。通常、Hibernate Search はクラスタイプとプライマリーキーを抽出する必要があります。
インデックスから必要な値を抽出するには、パフォーマンス負荷がかかります。パフォーマンス負荷が極めて低く、気付かない場合もありますが、キャッシュを行うのに役立つ場合もあります。
この要件は、使用されている 「プロジェクション」 によって異なります。これは、クラスタイプがクエリーコンテキストまたは他の方法で推測される可能性があるため、クラスタイプが不要なためです。
@
CacheFromIndex
アノテーションを使用すると、Hibernate Search に必要なメインのメタデータフィールドのキャッシュをさまざまな方法で試すことができます。
import static org.hibernate.search.annotations.FieldCacheType.CLASS; import static org.hibernate.search.annotations.FieldCacheType.ID; @Indexed @CacheFromIndex( { CLASS, ID } ) public class Essay { ...
このアノテーションを使用してクラスタイプと ID をキャッシュできます。
CLASS
: Hibernate Search は Lucene FieldCache を使用して、インデックスからクラスタイプの抽出のパフォーマンスを改善します。この値はデフォルトで有効になっており、@CacheFromIndex
アノテーションを指定しない場合に Hibernate Search が適用されます。ID
: プライマリー識別子はキャッシュを使用します。これにより、パフォーマンスが最も高いクエリーが提供されますが、消費するメモリーが多くなり、パフォーマンスが低下する可能性があります。
注記
ウォームアップ後のパフォーマンスおよびメモリー消費の影響を測定します (一部のクエリーの実行)。パフォーマンスは、フィールドキャッシュを有効にすることによって改善される可能性がありますが、常に改善されるわけではありません。
FieldCache の使用は、以下の点を考慮してください。
- メモリー使用量: このキャッシュには、かなりメモリーがハングします。通常、CLASS キャッシュの要件は ID キャッシュの要件よりも低くなります。
- インデックスウォームアップ: フィールドキャッシュを使用する場合、新しいインデックスまたはセグメントの最初のクエリーは、キャッシュが有効になっていない場合よりも遅くなります。
一部のクエリーでは、クラスタイプは全く不要です。その場合、
CLASS
フィールドキャッシュを有効にしても使用されない可能性があります。たとえば、単一クラスをターゲットとしている場合は、返される値はすべてそのタイプのものになります (これは各クエリー実行時に評価されます)。
ID FieldCache を使用するには、ターゲットエンティティーの ID が
TwoWayFieldBridge
(すべてのブリッジの構築として) を使用し、特定のクエリーに読み込まれるすべてのタイプが id のフィールド名を使用し、同じタイプの ID が割り当てられている必要があります (これは各クエリー実行時に評価されます)。