14.3.4. ファセット


ファセット検索は、クエリーの結果を複数のカテゴリーに分割できる技術です。この分類には、各カテゴリーのヒット数の計算や、これらのファイン (カテゴリー) に基づいて検索結果をさらに制限する機能が含まれます。例14.55「Amazon で HibernateSearch を検索する」 ファセットの例を示します。ページのメイン部分に表示される検索結果が表示されます。ただし、左側のナビゲーションバーには、ProgrammingComputer ScienceDatabasesSoftwareWeb DevelopmentNetworkingHome 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 を検索する

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インスタンスが作成されます。ファセット インスタンスは、この特定のフィールド値が元のクエリー結果内で発生する頻度を含む実際のフィールド値を記録します。orderedByincludeZeroCountsmaxFacetCountは、任意のファセット要求に適用できるオプションのパラメーターです。orderedBy 作成されたファセットが返される順序を指定できます。デフォルトはFacetSortOrder.COUNT_DESC、ただし、フィールド値または範囲が指定された順序で並べ替えることもできます。includeZeroCount カウントが 0 のファセットを結果に含めるかどうかを決定します (デフォルトでは含まれます)。maxFacetCount返されるファセットの最大量を制限できます。
注記
現時点では、ファセッティングを適用するためにインデックス化されたフィールドを満たす必要のあるいくつかの前提条件があります。インデックス付きプロパティーは StringDate、または Number および null の値を持つものは使用しないでください。さらに、プロパティーは Analyze.NO でインデックス化する必要があり、数値プロパティー @NumericField を指定する場合は指定する必要があります。
一定の範囲のファセットリクエストの作成は、ブックマークするフィールド値の範囲を指定する必要がある点以外は非常に似ています。一定の範囲のファセットリクエストは、複数の異なるレート範囲が指定されている場合に例14.58「範囲ファセットリクエストの作成」 で確認できます。belowabove指定できるのは 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();
Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.