Elasticsearchのアナライザにはアクセントを区別するものがあり、例えばカタルーニャ語のアナライザでは、インデックスされた単語が「diputació」であっても「diputacio」と検索すると結果が返されません。
ほとんどの言語では、ユーザーが検索クエリからアクセントを除外することが一般的であるため、アクセントを考慮しない検索は期待される動作であるため、これは問題となる場合があります。
回避策として、Elasticsearch レベルでこの挙動を回避するために、 "asciifolding" フィルタ をデフォルトの Elasticsearch アナライザに追加することが可能です。
環境
- Liferay DXP 7.0 - 7.4
- Elasticsearch 2.xから7.xまで。
カスタムアナライザーを作成する
既存のアナライザーからカスタムアナライザーを作成するためには、 Elasticsearch documentation からオリジナルの設定をコピーし、必要な修正を加える必要があります。
例えば、「asciifolding」を適用したカタランアナライザーを再定義したい場合、次のような定義になります:
"analysis": {
"filter": {
"catalan_elision": {
"type": "elision",
"articles": [ "d", "l", "m", "n", "s", "t"],
"articles_case": true
},
"catalan_stop": {
"type": "stop",
"stopwords": "_catalan_"
},
"catalan_stemmer": {
"type": "stemmer",
"language": "catalan"
}
},
"analyzer": {
"catalan": {
"tokenizer": "standard",
"filter": [
"catalan_elision",
"lowercase",
"asciifolding",
"catalan_stop",
"catalan_stemmer"
]
}
}
}
変更:
- "lowercase" と "catalan_stop" フィルターの間に "asciifolding" を追加しました。
- "catalan_keywords "セクションは、定義するキーワードがないため、削除しました。
- アナライザーの名前は、既存のデフォルト定義と同じ「catalan」としました。これは、それを上書きしたいからです。
カスタムアナライザーを適用する
カスタムアナライザーをLiferayインデックスに適用する場合、アナライザーはインデックス作成時にしか変更できないため、Liferay側で設定する必要があります。 既存のインデックスに対してアナライザーを再定義することはできません。
Liferayのインストールでカスタムアナライザーを適用するには、以下のステップを実行します:
- コントロールパネル → 設定 → システム設定 に移動します。
- Elasticsearch 6(またはElasticsearch 7)のエントリーを見つけ(スクロールして参照するか、検索ボックスを使用)、アクションアイコン(Actions)、編集(Edit)の順でクリックします。
- "追加インデックス設定" にアクセスし、カスタムアナライザーを含むJSONフラグメントをそこにコピーしてください。
- 注:このフィールドに既存の設定がある場合、両方のJSON設定をマージする必要があります。
- [Save]をクリックします。
- 新しいアナライザーを適用するために、 再インデックスを実行します: DXP 7.1 および 7.2 ではコントロールパネル → 設定 → 検索、DXP 7.3 では [インデックス管理] タブ、DXP 7.0 ではコントロールパネル → 設定 → サーバ管理 に移動し、[すべての検索インデックスの再作成] の隣にある [実行] をクリックします。
重要:完全な再インデックスには長い時間がかかることがあり、CPU負荷が非常に高く、すべての検索機能に影響を与える可能性があります。 システムの稼働率が低い時(夜間など)に実行することを考慮すること
Liferayのインデックスが再生成されると、カスタムアナライザーを持つことになります。 この例では、"catalan "アナライザーを用意し、既成のcatalanアナライザーを上書きすることにします。 この設定はLiferayのインデックスにのみ適用されるので、同じElasticsearchクラスタに保存されている他のサードパーティのインデックスには影響しません。
ローカライズされていないフィールド
ローカライズされていない(名前が言語IDで終わっていない)フィールドは、フィールドレベルでアナライザーが定義されていないため、予備として 標準アナライザー を使って分析されます。
アクセントに鈍感なアナライザーで構成したい場合、2つの選択肢があります:
オプション1:インデックスに「デフォルト」アナライザーを定義する
インデックス設定で「デフォルト」アナライザーを設定することができます。 このデフォルトの解析器は、標準の解析器の代わりに使用されます。
したがって、標準アナライザのコピーである「default」という新しいアナライザを定義し、asciifoldingフィルタを追加することができます:
"analysis": {
"analyzer": {
"default": {
"tokenizer": "standard",
"filter": [
"lowercase",
"asciifolding"
]
}
}
}
重要な注意事項: 特定のアナライザーを持たないすべてのフィールドは、この新しいデフォルトのアナライザーで分析されるため、アクセントに敏感でなければならないフィールドをインデックスに持つ場合に問題が発生することがあります。
オプション2:タイプマッピングでカスタムアナライザーを適用する
デフォルトのインデックスアナライザーを定義する代わりに、asciifoldingフィルターを適用した標準アナライザーのカスタムバージョンを作成し、アクセント記号に鈍感にしたい特定のフィールドに設定することも可能です。
Liferay Elasticsearch Connectorの設定の「Additional Type Mappings」セクションで、そのフィールドにアナライザを適用する必要があります、参照:例えば、"custom_standard_analyzer "を "lastName "フィールドに適用し、この設定を "Additional Type Mappings "フィールドに追加することが可能です:
{
"LiferayDocumentType": {
"properties": {
"lastName": {
"analyzer": "custom_standard_analyzer",
"store": "true",
"type": "text"
}
}
}
}
一方では、ローカライズされていないどのフィールドをアクセントに鈍感にするかをよりコントロールできるようになりますが、その反面、すべてのフィールドを手動で設定しなければならないので、手間がかかるようになるでしょう。
複数のアナライザーを定義する
複数のアナライザーを定義する場合は、それぞれのアナライザーのJSON設定を統合し、「フィルター」と「アナライザー」の設定部分を1つだけ残す必要があります。
例えば、「asciifolding」を適用して「catalan」と「spanish」を再定義したい場合、以下のように設定します:
"analysis": {
"filter": {
"catalan_elision": {
"type": "elision",
"articles": [ "d", "l", "m", "n", "s", "t"],
"articles_case": true
},
"catalan_stop": {
"type": "stop",
"stopwords": "_catalan_"
},
"catalan_stemmer": {
"type": "stemmer",
"language": "catalan"
},
"spanish_stop": {
"type": "stop",
"stopwords": "_spanish_"
},
"spanish_stemmer": {
"type": "stemmer",
"language": "light_spanish"
}
},
"analyzer": {
"catalan": {
"tokenizer": "standard",
"filter": [
"catalan_elision",
"lowercase",
"asciifolding",
"catalan_stop",
"catalan_stemmer"
]
},
"spanish": {
"tokenizer": "standard",
"filter": [
"lowercase",
"asciifolding",
"spanish_stop",
"spanish_stemmer"
]
}
}
}