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" ] } } }