カスタムフィルターの例
カスタムフィルターウィジェットは、検索チューニングを強力にサポートします。 カスタムコードを導入することなく、検索エンジンに送信されるクエリをコントロールすることができます。 ここでは、カスタムフィルターウィジェットへのアプローチ方法を理解するために、いくつかの一般的な使用例を紹介します。
カスタム フィルター ウィジェットの詳細な説明については、 カスタム フィルター ウィジェットの使用 を参照してください。
カスタム フィルター ウィジェットで使用できるインデックス フィールドの詳細については、 「インデックス フィールドの調査」 を参照してください。
一部のコンテンツを除く
カスタムフィルタは、 must_not Occur の設定と一緒に使用すると、検索結果からドキュメントをキャッチして除外することができます。
一部のドキュメントおよびメディアコンテンツを除く
場合によっては、特定のタイプのコンテンツを検索結果に表示させないようにしたいことがあります。 Webコンテンツに追加するシステムにしか存在しないドキュメントやメディアファイルのエントリを除外するには、まず、除外する特定のファイルを、検索インデックスで識別できるように区別する必要があります。 目的を宣言するタグ (たとえばwconly ) を付けたり、専用の ドキュメントとメディア フォルダーに配置したりすることができます。 カスタムフィルタでドキュメントとメディアフォルダを除外するには、以下の設定を行います。
フィルタークエリタイプ: 一致
フィルターフィールド: フォルダーID
フィルター値: 41103
発生: 必須ではない
この構成により、値41103のfolderIdフィールドを含む検索ドキュメントが検索結果に返されないようになります。
特定の拡張子を持つコンテンツの除外
おそらく、GIFファイルを検索結果から除外しなければなりません。 カスタムフィルターを以下のように設定します。
フィルタークエリタイプ: 一致
フィルターフィールド: 拡張子
フィルター値: gif
発生: 必須ではない
この構成は、ドキュメントとメディア DLFileEntry モデルからインデックス付けされた 拡張 フィールドの存在を活用します。 これにより、値gifのextentionフィールドを含む検索文書が検索結果に返されないようになります。
ブーストフィールド
特定のフィールドに基づいて特定のドキュメントを強化したいというニーズはよくありますが、「カスタムフィルタ」ウィジェットを使えば、簡単に実現できます。 ブースト値は、お客様のニーズに合わせてチューニングが必要な場合があります。 検索インサイトウィジェットを使用し、[スコアの説明を有効にする]を有効にして、ドキュメントがどのようにスコアリングされているかを調べ、ブースト値を微調整します。
日付の範囲による結果のブースト
カスタム フィルター ウィジェットの構成フォーム の日付範囲クエリ オプションは、 Elasticsearch 範囲クエリに対応します。 過去1年以内に作成された結果をブーストするには、ページにカスタムフィルターを追加して、次のように設定します。
フィルターフィールド: createDate
フィルター値: [現在-1年前]
フィルタークエリタイプ: 範囲
発生: すべき
ブースト: 100
過去1年間に作成された結果は、このカスタムフィルターの結果としてブーストされます。 そこで、次のようなタイトルと内容で、3分程度の間隔で2つのブログを作成します。
| ブログ1 | ブログ2 |
|---|---|
タイトル liferay dxp | タイトル liferay dxp |
コンテンツ:Liferay dxp | コンテンツ:liferay |
dxpで検索した場合、先のブログの方が検索キーワードが多いので検索結果の上位に表示され、どちらも昨年に作成されているので同等にブーストされています。
2 番目のブログ投稿を作成した直後に、カスタム フィルターのフィルター値を [now-2m now]–に設定します。この値は調整する必要がある場合があります。
もう一度検索すると、検索結果のブログの順番は、古いブログが最初に表示されます。(新しいブログが設定された時間範囲内に作成され、古いブログがそうでない場合)。
範囲を指定する方法の詳細については、 Elasticsearch date-math ドキュメント を参照してください。
指定フィールドへの一致をブースト
検索したキーワードに一致する特定のフィールドを持つドキュメントをブーストするには、次のようにカスタムフィルターを設定します。
フィルタークエリタイプ: 複数一致
フィルターフィールド: title_en_US、content_en_US
発生: すべき
ブースト: 100
カスタムパラメータ名: q
この設定では、英語(米国)のタイトルとコンテンツに、ユーザーが検索バーウィジェットに入力したキーワードが含まれている場合、ドキュメントのマッチングがブーストされます。 カスタムパラメーター名を検索バーのキーワードパラメーター名の設定と同じ値で入力すると、検索バーに渡された値がカスタムフィルターでブーストされた値になります(検索インデックスのドキュメントにマッチした場合)。
マルチマッチクエリは、複数のフィールドを一度にマッチさせることができます。 そうしないと、他の設定値が同じであっても、個別のフィールドごとにカスタムフィルタを設定する必要があります。
フィールドの存在による後押し
タグの値に関わらず、タグ付けされたコンテンツをブーストするには、次のようにカスタムフィルターを設定します。
フィルタークエリタイプ: 存在
フィルターフィールド: assetTagNames
発生: すべき
ブースト: 100
クエリにマッチするドキュメントがタグ付けされている場合、 assetTagNamesフィールドが含まれます。 Existsクエリは、フィールドのあらゆる値にマッチします。
サイトIDによるフィルタリング
1つのページの検索で複数のサイトを検索する際に、すべてのサイトを検索しない設定はありません。 現在のサイトとすべての 子サイト からの結果を含めるには、検索バーのスコープを すべてに設定する必要があります。 その後、検索結果に含めるサイトのgroupIdをマッチさせるためのtermクエリを持つカスタムフィルターウィジェットが、それぞれの子クエリ句を集めることができるBoolクエリを持つ1つの親カスタムフィルターを使用します。 サイトのIDは、ドキュメントの検索のgroupIdフィールドです。
-
3つのサイトを作る:
- 子サイトを持つ親サイトを1つ以上作成してください。
- 検索にかからない追加のSiteを1つ以上作成する。
ヒントサイトのグループIDを確認するには、サイトメニューのConfiguration > Settingsに移動します。 表示されている
サイト IDは、サイトをフィルタリングするために使用できるグループ IDです。 -
各Siteに少なくとも1つのコンテンツ(Blog Entry)を作成し、それぞれに Liferay という単語を入れてください。
-
検索バーのスコープを Everythingに設定します。
チェックポイント: 検索して、すべてのサイトのコンテンツが返されることを確認する

-
親のカスタムフィルターを設定します。
フィルタークエリタイプ:
ブール値発生:
フィルタークエリ名:
SiteBoolQuery -
検索対象とするサイトごとにカスタムフィルターを設定します。
フィルタークエリタイプ:
用語フィルターフィールド:
グループID発生:
すべき親クエリ:
SiteBoolQueryフィルター値:
38109上のスクリーンショットのコンテンツの例では、もうひとつカスタムフィルタが必要です。 フィルターの値を
38105とすること以外は、上記と同じように設定します。チェックポイント: 再度検索を行い、指定したサイトのみのコンテンツが表示されることを確認します。 これは、検索結果が Display Results in Document Formに設定されている場合、詳細ビューを見てさらに確認することができます。

重要なのは、groupIdによるフィルタは、SiteBoolQueryを親クエリとして宣言していることです。 各サイトの子Termクエリの should Occur句は、OR演算子として機能し、 groupIdのいずれかがマッチした場合、そのコンテンツが[検索結果]ウィジェットに表示されるようになっています。
クエリ文字列による複合フィルタ
場合によっては、 サイト ID によるフィルタリング の例のように、 クエリ文字列クエリを使用することで、複数のクエリを実行する必要がなくなります。 以下の設定では、1つのカスタムフィルターウィジェットのみを使用して、検索対象を制限する方法を示しています。
- ドキュメントとメディアファイルを
pdfまたは、jpg拡張子に一致させる。 - ウェブコンテンツの記事に合わせる
カスタムフィルターウィジェットを以下のように設定します。
フィルタークエリタイプ: クエリ文字列
発生: フィルター
フィルタ値: ((extension:pdf OR extension:jpg) AND entryClassName:com.liferay.document.library.kernel.model.DLFileEntry) OR entryClassName:com.liferay.journal.model.JournalArticle
意図した優先順位を確実に実行するためには、括弧の使用を推奨します。
ページの検索の構成を簡素化すること(複雑なケースを1つのカスタムフィルタウィジェットだけで処理することが多い)は良いことですが、検索文字列クエリはカスタムフィルタウィジェットの複雑さをすべて解決するものではありません。 検索文字列タイプでは真似できないクエリもあります。 たとえば、ネストされたドキュメントを検索するためのネストされたクエリ、分析を回避するためのTermクエリ、またはプレフィックスに基づいて検索するためのプレフィックスクエリを処理することはできません。
渡される値が検索バーから取得される場合は、クエリ文字列クエリを使用しないでください ( 指定されたフィールドへの一致の強化で示されているように)。 検索バーのユーザーが無効な構文を含むキーワードを入力した場合、エラーが返されます。
ネストしたフィールドへのブーストマッチ
7.2 FP10+、7.3 FP1+、7.4(すべてのアップデート)が利用可能
カスタム フィルター構成で ネストされたフィールド を使用するには、検索ページに 3 つのカスタム フィルター ウィジェットが必要です。 必要な子クエリをラップする ネストされたクエリ がウィジェットの 1 つに追加されます。1 つの子クエリはフィールドの名前と一致し、もう 1 つは値と一致します。
この例では、特定のDDMストラクチャー項目にマッチした場合のブーストを追加しています。
-
構造を作成します。
-
[サイト] メニューで、[コンテンツ & [データ] → [Web コンテンツ] に移動します。
-
構造 タブをクリックし、追加ボタン
をクリックします。 -
ストラクチャーにタイトル(例: Boosted Content)とこれらのフィールドを与えます。
-
フィールド 1:
- タイプ:
ブール値 - フィールドラベル:
ブースト?
- タイプ:
-
フィールド 2:
- タイプ:
テキスト - フィールドラベル:
コンテンツ
- タイプ:
-
-
ストラクチャーを保存します。
ストラクチャーのフィールドは、デフォルトではインデックス化されています。
-
-
新しいストラクチャーを使用する Web コンテンツを 1 つ追加します。
- タイトル:
ブースト - ブースト?
真 - コンテンツ:
テスト。
- タイトル:
-
新しいストラクチャーを使用する2つ目のWebコンテンツを追加します。
- タイトル:
ブーストされていません - ブースト?
偽 - コンテンツ:
テストコンテンツ。
- タイトル:
-
検索ページに移動し、 test contentと検索します。
チェックポイント: コンテンツフィールドが完全に一致しているため、BoostedされていないWebコンテンツがBoostedされたWebコンテンツよりも先に表示されます。
-
検索結果ウィジェットの設定で、 結果をドキュメント形式で表示 を有効にします。
-
ddmFieldArrayフィールドを見つけて、その値をコピーします。 例えば、"ddmFieldArray" : [ { "ddmFieldName" : "ddm__keyword__44012__Checkbox08350381_en_US", "ddmFieldValueKeyword_en_US" : "true", "ddmFieldValueKeyword_en_US_String_sortable" : "true", "ddmValueFieldName" : "ddmFieldValueKeyword_en_US" } ], -
検索ページに行き、Elasticsearchのレスポンスデータを使って3つのカスタムフィルタを追加します。
-
フィルタ1、親の入れ子のクエリ:
- フィルターフィールド:
ddmFieldArray - フィルタークエリタイプ:
ネストされた - 発生:
すべき - クエリ名:
親クエリ - ブースト:
500
- フィルターフィールド:
-
フィルター2、フィールド名の子マッチクエリ。
- フィルターフィールド:
ddmFieldArray.ddmFieldName - フィルタークエリタイプ:
一致 - 発生:
すべき - 値:
ddm__keyword__44012__Checkbox08350381_en_US - 親クエリ名:
parent_query - カスタムパラメータ名:
cparam
- フィルターフィールド:
-
フィルター3、Boostフィールドの
trueの値に対する子マッチクエリです。- フィルターフィールド:
ddmFieldArray.ddmFieldValueKeyword_en_US - フィルター値:
true - フィルタークエリタイプ:
一致 - 発生:
すべき - 親クエリ名:
parent_query - カスタムパラメータ名:
cparam
重要この例では、ネストされた 1 つのフィールドに対してのみカスタム フィルターを使用するため、子クエリ内のカスタム パラメーター (
cparam) は実際には必要ありません。 同じページ内の複数のネストされたフィールドにカスタム フィルターを設定するには、この例に示すように、子クエリのカスタム パラメーター名を構成する必要があります。 2 番目のネストされたフィールドにフィルターを追加するには、異なるカスタム パラメーター名を共有する 2 つの子カスタム フィルターが必要です (例:cparam2)。 - フィルターフィールド:
-
-
ここで、 test content の検索を繰り返し、BoostedされたウェブコンテンツがNot Boostedされていないウェブコンテンツの上に表示されることを確認します。
ブースト値は、お客様のニーズに合わせてチューニングが必要な場合があります。 検索インサイトウィジェットを使用し、[スコアの説明を有効にする]を有効にして、ドキュメントがどのようにスコアリングされているかを調べ、ブースト値を微調整します。