14.3.4. ファセット
ファセット検索は、クエリーの結果を複数のカテゴリーに分割できる技術です。この分類には、各カテゴリーのヒット数の計算や、これらのファイン (カテゴリー) に基づいて検索結果をさらに制限する機能が含まれます。例14.55「Amazon で HibernateSearch を検索する」 ファセットの例を示します。ページのメイン部分に表示される検索結果が表示されます。ただし、左側のナビゲーションバーには、Programming、Computer Science、Databases、Software、Web Development、Networking、Home Computing のサブカテゴリーを持つ Computers & Internet カテゴリーが表示されています。各サブカテゴリーについて、主要な検索条件に合致し、それぞれのサブカテゴリーに属する Book の数が表示されます。Computers & Internet のカテゴリーの区分は、特定の検索ファセットです。その他には、平均的なカスタマーレビューなどが挙げられます。
例14.55 Amazon で HibernateSearch を検索する
Hibernate Search の
QueryBuilder
クラスおよび FullTextQuery
クラスは、ファセット API へのエントリーポイントです。前者は要求を作成し、後者は FacetManager
にアクセスします。FacetManager
はクエリーにファセット要求を適用し、検索結果を絞り込むために既存のクエリーに追加されるブックマークを選択します。例では、次に示すようにエンティティー Cd
を使用します。例14.56「エンティティー Cd」:
図14.1 Amazon で HibernateSearch を検索する
例14.56 エンティティー Cd
@Indexed public class Cd { private int id; @Fields( { @Field, @Field(name = "name_un_analyzed", analyze = Analyze.NO) }) private String name; @Field(analyze = Analyze.NO) @NumericField private int price; Field(analyze = Analyze.NO) @DateBridge(resolution = Resolution.YEAR) private Date releaseYear; @Field(analyze = Analyze.NO) private String label; // setter/getter ...
14.3.4.1. ファセット要求の作成
ファセット検索に対する最初のステップは、
FacetingRequest
を作成することです。現時点では、2 種類のセッティング要求がサポートされています。最初のタイプは discrete faceting と呼ばれ、次のタイプは range faceting 要求と呼ばれます。個別のファセットリクエストの場合は、ファセット (分類) を行うインデックスフィールドと、適用するファセットオプションを指定します。個別のファセットリクエストの例は、次のように表示されます。例14.57「個別のファセットリクエストの作成」:
例14.57 個別のファセットリクエストの作成
QueryBuilder builder = fullTextSession.getSearchFactory() .buildQueryBuilder() .forEntity( Cd.class ) .get(); FacetingRequest labelFacetingRequest = builder.facet() .name( "labelFaceting" ) .onField( "label") .discrete() .orderedBy( FacetSortOrder.COUNT_DESC ) .includeZeroCounts( false ) .maxFacetCount( 1 ) .createFacetingRequest();
このファセットリクエストを実行すると、インデックス設定された
label
フィールドの個別値ごとに Facet
インスタンスが作成されます。ファセット
インスタンスは、この特定のフィールド値が元のクエリー結果内で発生する頻度を含む実際のフィールド値を記録します。orderedBy
、includeZeroCounts
とmaxFacetCount
は、任意のファセット要求に適用できるオプションのパラメーターです。orderedBy
作成されたファセットが返される順序を指定できます。デフォルトはFacetSortOrder.COUNT_DESC
、ただし、フィールド値または範囲が指定された順序で並べ替えることもできます。includeZeroCount
カウントが 0 のファセットを結果に含めるかどうかを決定します (デフォルトでは含まれます)。maxFacetCount
返されるファセットの最大量を制限できます。
注記
現時点では、ファセッティングを適用するためにインデックス化されたフィールドを満たす必要のあるいくつかの前提条件があります。インデックス付きプロパティーは
String
、Date
、または Number
および null
の値を持つものは使用しないでください。さらに、プロパティーは Analyze.NO
でインデックス化する必要があり、数値プロパティー @NumericField
を指定する場合は指定する必要があります。
一定の範囲のファセットリクエストの作成は、ブックマークするフィールド値の範囲を指定する必要がある点以外は非常に似ています。一定の範囲のファセットリクエストは、複数の異なるレート範囲が指定されている場合に例14.58「範囲ファセットリクエストの作成」 で確認できます。
below
とabove
指定できるのは 1 回だけですが、指定できるのはいくつでもかまいませんfrom
-to
あなたが望むように範囲。範囲の境界ごとに、次の方法で指定することもできます。excludeLimit
範囲に含まれるかどうか。
例14.58 範囲ファセットリクエストの作成
QueryBuilder builder = fullTextSession.getSearchFactory() .buildQueryBuilder() .forEntity( Cd.class ) .get(); FacetingRequest priceFacetingRequest = builder.facet() .name( "priceFaceting" ) .onField( "price" ) .range() .below( 1000 ) .from( 1001 ).to( 1500 ) .above( 1500 ).excludeLimit() .createFacetingRequest();