1.3. 設定
必要なすべての依存関係をダウンロードし、アプリケーションに追加したら、いくつのプロパティを hibernate 設定ファイルに追加する必要があります。Hibernate を直接使用している場合、これは
hibernate.properties
または hibernate.cfg.xml
で実行できます。JPA から Hibernate を使用している場合は、プロパティを persistence.xml
に追加することもできます。標準的な使用では、ほとんどのプロパティが適切なデフォルト値を提供します。サンプルの persistence.xml
設定は以下のようになります。
例1.3
、hibernate.properties
、または hibernate.cfg.xml
persistence.xml
に追加される基本的な設定オプション
最初に、使用する
DirectoryProvider
を Hibernate Search に指示する必要があります。これは、hibernate.search.default.directory_provider
プロパティを設定することにより達成できます。Apache Lucene には インデックスファイルを格納する Directory
の概念があります。Hibernate Search は DirectoryProvider
を使用して Lucene Directory
インスタンスの初期化と設定を処理します。このチュートリアルでは、FSDirectoryProvider
という名前の DirectoryProvider
のサブクラスを使用します。これにより、Hibernate Search によって作成された Lucene インデックスを物理的に検査できます (たとえば、Luke を使用)。稼働する設定がある場合は、他のディレクトリプロバイダを実験できます (「Directory 構成」 を参照)。ディレクトリプロバイダの次は、 hibernate.search.default.indexBase
を使用してすべてのインデックスに対してデフォルトのルートディレクトリを指定する必要があります。
アプリケーションに Hibernate により管理されたクラス
example.Book
と example.Author
が含まれ、データベースに含まれた書籍を検索するためにフリーテキスト検索機能をアプリケーションに追加したいとします。
例1.4 Hibernate Search 固有のアノテーションを追加する前のエンティティ Book と Author の例
これを達成するには、いくつかのアノテーションを
Book
および Author
クラスに追加する必要があります。最初のアノテーション @Indexed
は Book
をインデックス化可能としてマークします。設計により、Hibernate Search は特定のエンティティのインデックスの単一性を確保するためにインデックスに非トークン化 id を格納する必要があります。@DocumentId
は、このために使用するプロパティをマークし、ほとんどの場合はデータベース一次キーと同じです。実際には、Hibernate Search の 3.1.0 リリース以降、@DocumentId
はオプションです (@Id
アノテーションが存在します)。
次に、検索可能にするフィールドをマークする必要があります。まず、
title
と subtitle
を @Field
でアノテートします。パラメータ index=Index.TOKENIZED
により、テキストはデフォルトの Lucene アナライザを使用してトークン化されます。通常は、トークン化とは文を個々の単語に分割し、場合によっては 'a'
や 'the
' などの共通の単語を除外することを意味します。アナライザについては、後ほど詳しく説明します。 @Field
、 store=Store.NO
内で指定する2 つ目のパラメータは、実際のデータがインデックスに格納されないようにします。このデータがインデックスに格納されるかどうかは、その検索機能と関係ありません。Lucene の観点から、インデックスの作成後はデータを保持する必要がありません。これを格納する利点は、プロジェクション (「プロジェクション」) を使用して取得できることです。
プロジェクションがない場合、Hibernate Search はクエリ基準に一致するエンティティのデータベース ID を見つけるためにデフォルトで Lucene クエリを実行し、これらの ID を使用して管理されたオブジェクトをデータベースから取得します。プロジェクションを使用するかしないかの決定は、ケースバイケースで行う必要があります。管理されたオブジェクトを返すためデフォルトの動作
Store.NO
が推奨されます (プロジェクションはオブジェクトアレイのみ返します)。
次に、
Book
クラスのアノテートに戻ってみましょう。まだ説明してないアノテーションは @DateBridge
です。このアノテーションは、Hibernate Search のビルトインフィールドブリッジの 1 つです。Lucene インデックスは純粋に文字列ベースです。このため、Hibernate Search はインデックス化されたフィールドのデータタイプを文字列に変換する必要があります (また、文字列をフィールドのデータタイプに変換する必要があります)。事前に定義されたさまざまなブリッジ (java.util.Date
を指定されたレゾリューションを持つ String
に変換する DateBridge
を含む) が提供されます。詳細については、「プロパティ/フィールドのブリッジ」 を参照してください。
最後に
@IndexedEmbedded.
が残りました。このアノテーションは関連付けられたエンティティ (@ManyToMany
、@*ToOne
、および @Embedded
) を所有エンティティの一部としてインデックス化するために使用されます。これは、Lucene インデックスドキュメントがオブジェクト関係について何も知らないフラットなデータ構造であるため必要です。著者名が検索可能になるように、著者名は書籍自体の一部としてインデックス化する必要があります。また、@IndexedEmbedded
上で、@Indexed
を使用してインデックスに含める関連付けられたエンティティのすべてのフィールドをマークする必要があります。詳細については、「組込みおよび関連付けられたオブジェクト」 を参照してください。
この時点でこれらの設定は十分なはずです。エンティティマッピングの詳細については、「エンティティのマッピング」 を参照してください。
例1.5 Hibernate Search アノテーション追加後のサンプルエンティティ