検索レスポンスサイズの最適化
まれに、検索応答が大きすぎると、検索エンジンからエラー メッセージが表示されることがあります。
ERROR [http-nio-8080-exec-335][ElasticsearchIndexSearcher:165] java.lang.RuntimeException: java.io.IOException: entity content is too long [117672846] for the configured buffer limit [104857600]
応答で返されるドキュメントが多すぎる場合、応答サイズが最大許容応答サイズよりも大きくなる可能性があります。 検索ブループリントを使用して応答サイズを縮小するには、次の方法があります。
- 検索エンジンによって返されるフィールドをフィルタリングすることによって
- レスポンスからソースフィールドを除外することで
フィルタリングフィールド
デフォルトでは、Liferay は Elasticsearch からマップされたすべてのフィールドを要求します。 フィールドはマッピングで指定されます:
"userId": {
"type": "keyword"
},
通常、マップされたすべてのフィールドを返すことは無害です。 まれに、応答が大きすぎると、返されたコンテンツが構成されたバッファ制限に対して長すぎることを示す ERROR メッセージが表示されることがあります。
検索の応答サイズを縮小し、全体的なパフォーマンスを向上させるために、返されるフィールドをフィルター処理できます。 そのためには、Advanced Configurationフィールドに次のようなJSONでSearch Blueprintを作成する必要がある:
{
"fields": [
"userId"
]
}
これは、各ドキュメントで userId フィールドのみが返される必要があることを伝えます。
応答を検査するか、検索結果ウィジェットの「ドキュメント形式で結果を表示」設定を使用すると、 fieldsで宣言されているよりも多くのフィールドが返されることがわかります。 Liferay の検索フレームワークは、Liferay が適切に機能するために必要な特定のフィールド ( entryClassName、 entryClassPK、 companyIdなど) を自動的に追加します。
検索結果ウィジェットの要約フィールドを返す
検索結果ウィジェットは、 結果サマリーを生成するために、応答に特定のフィールドを必要とします。 概要フィールドはアセット固有ですが、多くのアセットでは、少なくともタイトル、コンテンツ、説明フィールドのローカライズされたバージョンが必要です。

ユースケースに応じて、レスポンスで返すフィールドが決まります。
検索結果サマリーに表示できるフィールドは、検索結果ウィジェットの表示ロジック (SearchResultsSummaryDisplayBuilder および SearchResultsSummaryDisplayContext) によって定義されます。
ソースフィールドを除外する
_source フィールドには、インデックス要求に渡された元のドキュメント本体が含まれます。 このフィールド自体はインデックス化されませんが、各ドキュメントの検索応答に保存され、返されます。 検索応答が大きすぎるためにエラーが発生した場合は、 _source フィールドを除外できます。
ソース フィールドを除外するには、ブループリントの 詳細構成 で fetchSource を false に設定する必要があります。
{
"source": {
"fetchSource": false
}
}
次の例に示すように、ソース フィールドを除外し、返されるフィールドを同時に制限できます。
例: 検索レスポンスで返されるフィールドを制限する
まれではありますが、翻訳されたコンテンツが大量にあるシステムで検索すると、検索結果が大きすぎることがあります。 回避策の 1 つは、Liferay で不要なロケールを無効にして、必要以上に翻訳されたフィールドが返されないようにすることです。 もう 1 つのアプローチは、ここで説明するように、検索ブループリントを使用して応答をトリミングすることです。
-
まず、Web コンテンツ記事を追加します。 サイトメニュー (
) を開き、 コンテンツ & データ → Web コンテンツに移動します。 -
追加 (
) → 基本 Web コンテンツ をクリックし、次のコンテンツを入力します。- タイトル: Webコンテンツ記事のタイトル
- 説明: Webコンテンツ記事の説明
- コンテンツ: Webコンテンツ 記事コンテンツ
-
グローバル メニュー (
) → アプリケーション → ブループリント (検索エクスペリエンス) を開きます。 -
追加 (
) をクリックします。 -
ブループリントに フィルター フィールドという名前を付けます。
-
ブループリントの プレビュー 画面を開き、 Web コンテンツを検索します。
-
作成した Web コンテンツのドキュメント プレビューを展開し、ドキュメントに多くのフィールドが含まれていることを確認します。

-
構成をクリックします。
-
詳細構成フィールドの内容を次のように置き換えます。
{ "source": { "fetchSource": false }, "fields": [ "content_${context.language_id}", "description_${context.language_id}", "title_${context.language_id}" ] }この構成では、現在のセッション言語のコンテンツ、説明、タイトル フィールドのみが応答で返されることを指定します。
-
ブループリントの プレビュー 画面を開き、再度 Web コンテンツ を検索します。
-
Test Test ユーザーのドキュメント プレビューを展開し、ドキュメントには指定したフィールドと Liferay の検索フレームワークによって追加されたいくつかのフィールドのみが含まれていることを確認します。

ソース フィールドを除外して返されるフィールドをフィルターする必要があることはほとんどありませんが、応答が大きすぎるという検索エンジンのエラー メッセージが表示される場合に役立ちます。