この記事では、DXP 7.0、7.1、7.2、7.3において、コントロールパネルからElasticsearchインデックスの最大フィールド数を増やす方法を説明します。 初期設定では7500フィールドに設定されており、通常7500フィールドを超える必要はありません。
Elasticsearchインデックスのフィールドの総数を増やすことは一般的に良い考えではありません。以下の記事で、Elasticがスループットの問題からこれらの設定を増やすことを推奨しているのをご覧ください:
この上限値を超えていることにログで気づいたら、まずは根本的な原因(カスタム開発によるものか、Liferay DXPによるものか)を分析する必要があります。
Liferay DXPの動的なデータマッピング構造には、このElasticsearchマッピングの爆発を引き起こす可能性のある既知の問題があります。詳細はこちらをご覧ください:
- 課題 LPS-103224 - DDM構造体が多い場合、Elasticsearchで「Limit of total fields has been exceeded」エラーが発生する。
- Elasticsearchのインデックスリミットエラーの総数について
同時に、最大フィールド数を増やす の前に、パフォーマンスの問題に対処するための最新の修正プログラムを含むことができる最新の DXP フィックスパックにアップグレードしてください。
- DXP 7.0を使用する場合、デフォルトのコネクタはバージョン 2.x です。 Elasticsearch 6.x をお使いの方は、まず Elasticsearch 6 connector をインストールする必要があります。
- DXP 7.2を使用する場合、デフォルトのコネクタはバージョン 6.x です。 Elasticsearch 7.x をお使いの方は、まず Elasticsearch 7 connector をインストールする必要があります。
- DXP 7.3を使用する場合、デフォルトのコネクタはバージョン 7.x です。
マッピングとインデックスの適切なフィールド数に関する情報は、こちらをご覧ください: マッピングの爆発を防ぐための設定.
現在の最大フィールド数は7500です。 これは、プロパティ index.mapping.total_fields.limit=7500
で指定します。
環境
- Liferay DXP 7.0、7.1、7.2、7.3
- Elasticsearch 6.x~7.xの場合
解像度
"Limit of total fields [7500] in index [liferay-20116] has been exceeded"エラーで総フィールド数を変更したい場合は、まず以下の記事を確認してください。Total Number of Index Limit Error in Elasticsearchを確認して、LPS-103224からの問題に遭遇した場合に備えて、システムにパッチを当てることで、そのエラーを回避することができます。
システムにパッチを当てられない場合、または問題がその既知の問題によって引き起こされていない場合、回避策として、Elasticsearchのフィールド数を増やしてみることができますが、それには2つのステップが必要です:1) Systems Settingsの設定を変更し、2) reindexを行う。
Part 1:システム設定を変更する。
- コントロールパネル → 設定 → システム設定に移動してください。
- プラットフォーム」の下にある「検索」をクリックします。
- システムスコープ」の「 Elasticsearch / Elasticsearch 6 / Elasticsearch 7 」(お使いのコネクタのバージョンによります)をクリックします。
-
インデックス追加設定で、次のように入力します:
index.mapping.total_fields.limit: 10000
. (注:この項目は、ページの下部付近にあります)。 - [Save]ボタンをクリックします。
この時点で、プラットフォームは構成されているが、新しいインデックスが必要である。
第2部:インデックスの再構築
- コントロールパネル → 設定 → サーバー管理 or コントロールパネル → 設定 → 検索 DXP 7.1, 7.2, 7.3 の場合)へ移動してください。
- Index Action セクションで、 Reindex all search index の隣にある Execute をクリックします。
インデックスの再構築が完了するのを待ちます。 再インデックス処理中に、コンソールに次のような表示がされます:
2018-12-12 18:52:45.267 INFO [elasticsearch[Q][clusterService#updateTask][T#1]][metadata:317] [Q] [liferay-77336] update_mapping [LiferayDocumentType]
2018-12-12 18:52:45.493 INFO [elasticsearch[Q][clusterService#updateTask][T#1]][metadata:317] [Q] [liferay-77336] update_mapping [LiferayDocumentType]
2018-12-12 18:52:45.569 TRACE [elasticsearch[Q][bulk][T#4]][index:158] [Q][liferay-0][0] took[591.7ms], took_millis[591], type[LiferayDocumentType], id[com_liferay_configuration_admin_web_portlet_SystemSettingsPortlet_PORTLET_com.liferay.portal.template.freemarker.configuration.FreeMarkerEngineConfiguration], routing[] , source[{"uid":"com_liferay_configuration_admin_web_portlet_SystemSettingsPortlet_PORTLET_com.liferay.portal.template.freemarker.configuration.FreeMarkerEngineConfiguration","companyId":"0","configurationModelId":"com.liferay.portal.template.freemarker.configuration.FreeMarkerEngineConfiguration","entryClassName":"com.liferay.configuration.admin.web.internal.model.ConfigurationModel","configurationModelFactoryPid":"com.liferay.portal.template.freemarker.configuration.FreeMarkerEngineConfiguration","title_zh_CN":"FreeMarker引擎","title_es_ES":"Motor FreeMarker","title_ja_JP":"FreeMarker エンジン","title_iw_IL":"מנוע FreeMarker","title_nl_NL":"FreeMarker Engine","title_fi_FI":"FreeMarker -moottori","title_ca_ES":"Motor de Freemarker","title_hu_HU":"FreeMarker motor","title_fr_FR":"Moteur FreeMarker","title":"FreeMarker Engine","title_en_US":"FreeMarker Engine","title_pt_BR":"Mecanismo FreeMarker","title_de_DE":"FreeMarker Engine","configurationModelAttributeName":["localized-lookup","resource-modifica]
2018-12-12 18:52:45.612 INFO [elasticsearch[Q][clusterService#updateTask][T#1]][metadata:317] [Q] [liferay-77336] update_mapping [LiferayDocumentType]
2018-12-12 18:52:46.409 INFO [elasticsearch[Q][clusterService#updateTask][T#1]][metadata:317] [Q] [liferay-20116] update_mapping [LiferayDocumentType]
再インデックスが正常に完了すると、Elasticsearchの最大フィールド数が増加しました。
また、、完全な再インデックスを避けるために、Elasticsearch の Settings API を使って、既存のインデックスでこの設定を更新することもできます:
PUT liferay-20155/_settings
{
"index.mapping.total_fields.limit": 2000
}
( liferay-20155 は、仮想インスタンスの会社IDを指します。 複数のインデックスがある場合は、それぞれでこの設定を更新する必要があります)。
curlを使用している場合、コマンドは次のようになります(実際のホストとポート番号に依存します):
curl -X PUT "localhost:9200/liferay-20155/_settings" -H 'Content-Type: application/json' -d
'{
"index.mapping.total_fields.limit": 2000
}'
Elasticsearch Stackが暗号化通信(TLS/SSL)とユーザー認証を使用している場合、curlコマンドは若干異なります:
curl -u "elastic:liferay" -k -X PUT "https://localhost:9200/liferay-20155/_settings" -H "Content-Type: application/json" -d
'{
"index.mapping.total_fields.limit": 2000
}'
(elastic:liferay" は、組み込みの elastic ユーザーのように、Elasticsearch X-Pack Security で管理者権限を持つユーザーのユーザー名とパスワードにする必要があります)。