Documentation

カスタムフィルターの例

カスタムフィルターウィジェットは、検索チューニングを強力にサポートします。 カスタムコードを導入することなく、検索エンジンに送信されるクエリをコントロールすることができます。 ここでは、カスタムフィルターウィジェットへのアプローチ方法を理解するために、いくつかの一般的な使用例を紹介します。

カスタムフィルターウィジェットの詳細な説明については、 フィルター検索結果 を参照してください。

一部のコンテンツを除く

カスタムフィルタは、 must_not Occur の設定と一緒に使用すると、検索結果からドキュメントをキャッチして除外することができます。

一部のドキュメントおよびメディアコンテンツを除く

場合によっては、特定のタイプのコンテンツを検索結果に表示させないようにしたいことがあります。 Webコンテンツに追加するシステムにしか存在しないドキュメントやメディアファイルのエントリを除外するには、まず、除外する特定のファイルを、検索インデックスで識別できるように区別する必要があります。 目的を明示したタグ(wconly など)を付けたり、専用の ドキュメントとメディアフォルダに入れたりすることができます。 カスタムフィルタでドキュメントとメディアフォルダを除外するには、以下の設定を行います。

フィルタクエリタイプ: Match

フィルタフィールド: folderId

フィルタ値: 41103

発生: must_not

この構成により、値41103folderIdフィールドを含む検索ドキュメントが検索結果に返されないようになります。

特定の拡張子を持つコンテンツの除外

おそらく、GIFファイルを検索結果から除外しなければなりません。 カスタムフィルターを以下のように設定します。

フィルタクエリタイプ: Match

フィルタフィールド: extension

フィルタ値: gif

発生: gif

この構成は、ドキュメントとメディア DLFileEntryモデル からインデックス付けされたextensionフィールドの存在を利用します。 これにより、値gifextentionフィールドを含む検索文書が検索結果に返されないようになります。

ブーストフィールド

特定のフィールドに基づいて特定のドキュメントを強化したいというニーズはよくありますが、「カスタムフィルタ」ウィジェットを使えば、簡単に実現できます。 ブースト値は、お客様のニーズに合わせてチューニングが必要な場合があります。 スコアの説明を有効にする を有効にして 検索インサイト ウィジェットを使用し、ドキュメントがどのようにスコアリングされているかを調べ、ブースト値を微調整します。

日付の範囲による結果のブースト

カスタムフィルターウィジェットの設定フォーム のDate Rangeクエリオプションは、 Elasticsearch Rangeクエリ に対応します。 過去1年以内に作成された結果をブーストするには、ページにカスタムフィルターを追加して、次のように設定します。

フィルタフィールド: createDate

フィルタ値: [now-1y now]

フィルター クエリータイプ: Range

発生: Should

ブースト: 100

過去1年間に作成された結果は、このカスタムフィルターの結果としてブーストされます。 そこで、次のようなタイトルと内容で、3分程度の間隔で2つのブログを作成します。

ブログ1

ブログ2

タイトル liferay dxp

タイトル liferay dxp

コンテンツ:Liferay dxp

コンテンツ:liferay

dxpで検索した場合、先のブログの方が検索キーワードが多いので検索結果の上位に表示され、どちらも昨年に作成されているので同等にブーストされています。

2つ目のブログ記事を作成した直後に、カスタムフィルターのフィルター値を [now-2m now]と設定します --この値は調整が必要な場合があります。

もう一度検索すると、検索結果のブログの順番は、古いブログが最初に表示されます。(新しいブログが設定された時間範囲内に作成され、古いブログがそうでない場合)。

範囲の指定方法については、 Elasticsearch date-math documentation を参照してください。

指定フィールドへの一致をブースト

検索したキーワードに一致する特定のフィールドを持つドキュメントをブーストするには、次のようにカスタムフィルターを設定します。

フィルタクエリタイプ: マルチマッチ

フィルターフィールド: title_en_US, content_en_US

発生: Should

ブースト: 100

カスタムパラメーター名: q

この設定では、英語(米国)のタイトルとコンテンツに、ユーザーが検索バーウィジェットに入力したキーワードが含まれている場合、ドキュメントのマッチングがブーストされます。 カスタムパラメーター名を検索バーのキーワードパラメーター名の設定と同じ値で入力すると、検索バーに渡された値がカスタムフィルターでブーストされた値になります(検索インデックスのドキュメントにマッチした場合)。

マルチマッチクエリは、複数のフィールドを一度にマッチさせることができます。 そうしないと、他の設定値が同じであっても、個別のフィールドごとにカスタムフィルタを設定する必要があります。

フィールドの存在による後押し

タグの値に関わらず、タグ付けされたコンテンツをブーストするには、次のようにカスタムフィルターを設定します。

フィルタクエリタイプ: Exists

フィルタフィールド: assetTagNames

発生: should

ブースト: 100

クエリにマッチするドキュメントがタグ付けされている場合、 assetTagNamesフィールドが含まれます。 Existsクエリは、フィールドのあらゆる値にマッチします。

サイトIDによるフィルタリング

1つのページの検索で複数のサイトを検索する際に、すべてのサイトを検索しない設定はありません。 現在のサイトとすべてのサブサイトからの結果を含めるには、検索バーのスコープを設定し、 すべて に設定する必要があります。 その後、検索結果に含めるサイトのgroupIdをマッチさせるためのtermクエリを持つカスタムフィルターウィジェットが、それぞれの子クエリ句を集めることができるBoolクエリを持つ1つの親カスタムフィルターを使用します。 サイトのIDは、ドキュメントの検索のgroupIdフィールドです。

  1. 3つのサイトを作る:

    • 子サイトを持つ親サイトを1つ以上作成してください。

    • 検索にかからない追加のSiteを1つ以上作成する。

    ちなみに

    サイトのグループIDを確認するには、サイトメニューのConfiguration > Settingsに移動します。 The displayed Site ID is the groupId you can use to filter the Site.

  2. 各Siteに少なくとも1つのコンテンツ(Blog Entry)を作成し、それぞれに Liferay という単語を入れてください。

  3. 検索バーのスコープを Everything に設定します。

    チェックポイント: 検索して、すべてのサイトのコンテンツが返されることを確認する

    この3つのBlogエントリーは、それぞれ別のサイトからのものです。

  4. 親のカスタムフィルターを設定します。

    フィルタクエリタイプ: Bool

    発生: Filter

    クエリ名: SiteBoolQueryです。

  5. 検索対象とするサイトごとにカスタムフィルターを設定します。

    フィルタクエリタイプ: Term

    フィルターフィールド: groupIdです。

    発生: shouldです。

    親クエリ: SiteBoolQueryです。

    フィルターの値: 38109となります。

    上のスクリーンショットのコンテンツの例では、もうひとつカスタムフィルタが必要です。 フィルターの値を 38105とすること以外は、上記と同じように設定します。

    チェックポイント: 再度検索を行い、指定したサイトのみのコンテンツが表示されることを確認します。 これは、検索結果が Display Results in Document Form に設定されている場合、詳細ビューを見てさらに確認することができます。

    含まれるサイトのコンテンツのみが表示されます。

重要なのは、groupIdによるフィルタは、SiteBoolQueryを親クエリとして宣言していることです。 各サイトの子Termクエリの should Occur句は、OR演算子として機能し、 groupIdのいずれかがマッチした場合、そのコンテンツが[検索結果]ウィジェットに表示されるようになっています。

クエリ文字列による複合フィルタ

サイトIDによるフィルタリング の例のように、 検索文字列クエリ を使用することで、複数のクエリを必要としない場合があります。 以下の設定では、1つのカスタムフィルターウィジェットのみを使用して、検索対象を制限する方法を示しています。

  • ドキュメントとメディアファイルを pdfまたは、jpg拡張子に一致させる。

  • ウェブコンテンツの記事に合わせる

カスタムフィルターウィジェットを以下のように設定します。

フィルタクエリタイプ: 検索文字列

発生: Filter

フィルタ値: ((extension:pdf OR extension:jpg) AND entryClassName:com.liferay.document.library.kernel.model.DLFileEntry) OR entryClassName:com.liferay.journal.model.JournalArticle

意図した優先順位を確実に実行するためには、括弧の使用を推奨します。

ページの検索の構成を簡素化すること(複雑なケースを1つのカスタムフィルタウィジェットだけで処理することが多い)は良いことですが、検索文字列クエリはカスタムフィルタウィジェットの複雑さをすべて解決するものではありません。 検索文字列タイプでは真似できないクエリもあります。 たとえば、ネストされたドキュメントを検索するためのネストされたクエリ、分析を回避するためのTermクエリ、またはプレフィックスに基づいて検索するためのプレフィックスクエリを処理することはできません。

警告

クエリ文字列クエリは、渡される値が検索バーからのものである場合には使用しないでください(Boosting Matches to Designated Fields_で説明しています)。 検索バーのユーザーが無効な構文を含むキーワードを入力した場合、エラーが返されます。

ネストしたフィールドへのブーストマッチ

提供時期:7.2 FP10 , 7.3 FP1/SP1

Accessing Nested DDM Fields で説明されているように、Liferay 7.2 SP3 /FP8 (およびLiferay 7.3のすべてのバージョン)では、DDMフィールドは ネストされたフィールド になりました。 7.2および7.3の最新のフィックスパックおよびGAリリースでは、これらのネストされたフィールドを考慮して、 Elasticsearch Nested query がサポートされています。

カスタムフィルターの設定での ネストされたフィールド を使用すると、ページの検索に3つのカスタムフィルターウィジェットが必要になります。 必要な子クエリをラップする ネストされたクエリ がウィジェットの1つに追加されます。1つの子クエリはフィールドの名前と一致し、もう1つは値と一致します。

この例では、特定のDDMストラクチャー項目にマッチした場合のブーストを追加しています。

  1. ストラクチャーを作成します。

    • サイトメニューの[コンテンツ] & [データ] → [ウェブコンテンツ]に移動します。

    • ストラクチャー タブをクリックし、追加ボタン Addをクリックします。

    • ストラクチャーにタイトル(例: Boosted Content)とこれらのフィールドを与えます。

      • フィールド 1:

        • タイプ: Boolean

        • フィールドラベル: Boost?

      • フィールド 2:

        • タイプ: テキストボックス

        • フィールドラベル: コンテンツ

    • ストラクチャーを保存する。

    ストラクチャーのフィールドは、デフォルトではインデックス化されています。

  2. 新しいストラクチャーを使用する Web コンテンツを 1 つ追加します。

    • タイトル: ブースト

    • Boost? True

    • コンテンツ: テスト

  3. 新しいストラクチャーを使用する2つ目のWebコンテンツを追加します。

    • タイトル: Not Boosted

    • Boost? False

    • コンテンツ: テストコンテンツ

  4. 検索ページに移動し、 test content と検索します。

    チェックポイント: コンテンツフィールドが完全に一致しているため、BoostedされていないWebコンテンツがBoostedされたWebコンテンツよりも先に表示されます。

  5. Kibana Dev Toolsコンソール、またはcURL経由のCLIから、フィールド名に Boost が含まれるDDMフィールドを検索するGETリクエストを実行します。

    GET liferay-20097/_search
    {
      "query": {
        "nested": {
          "path": "ddmFieldArray",
          "query": {
            "wildcard":  { "ddmFieldArray.ddmFieldName": "ddm__*Boost*" }
          }
        }
      }
    }
    

    20097 を、仮想インスタンスの companyId に置き換えます

  6. Elasticsearchのレスポンスの中で、ネストされたBoostフィールドを持つ ddmFieldArray を見つけてコピーします。

    "ddmFieldArray" : [
                {
                  "ddmFieldName" : "ddm__keyword__39707__Boost_en_US",
                  "ddmValueFieldName" : "ddmFieldValueKeyword_en_US",
                  "ddmFieldValueKeyword_en_US" : "true",
                  "ddmFieldValueKeyword_en_US_String_sortable" : "true"
                }
    
  7. 検索ページに行き、Elasticsearchのレスポンスデータを使って3つのカスタムフィルタを追加します。

    • フィルタ1、親の入れ子のクエリ:

      • フィルターフィールド: ddmFieldArrayとなります。

      • フィルタクエリタイプ: Nested

      • 発生: should

      • クエリ名: parent_query

      • Boost: 500

    • フィルター2、フィールド名の子マッチクエリ。

      • フィルターフィールド: ddmFieldArray.ddmFieldName

      • フィルタクエリタイプ: Match

      • 発生: should

      • 値: ddm__keyword__39707__Boost_ja_US

      • 親クエリ名: parent_query

    • フィルター3、Boostフィールドの true の値に対する子マッチクエリです。

      • フィルターフィールド: ddmFieldArray.ddmFieldValueKeyword_en_US

      • フィルターの値: true

      • フィルタクエリタイプ: Match

      • 発生: should

      • 親クエリ名: parent_query

  8. ここで、 test content の検索を繰り返し、BoostedされたウェブコンテンツがNot Boostedされていないウェブコンテンツの上に表示されることを確認します。

ブースト値は、お客様のニーズに合わせてチューニングが必要な場合があります。 検索インサイトウィジェットを使用し、 [スコアの説明を有効にする] を有効にして、ドキュメントがどのようにスコアリングされているかを調べ、ブースト値を微調整します。