アクセントを区別しないカスタムElasticsearchアナライザを作成する方法

アクセントに敏感なElasticsearchアナライザーもあり、例えばカタロニア語のアナライザーでは、「diputacio」と検索すると、インデックスされている単語が「diputació」であっても結果が返ってきません。

これは問題になることがあります。というのも、ほとんどの言語では、ユーザーが検索クエリからアクセントを除外するのが一般的であり、アクセントを考慮しない検索は期待される動作だからです。

回避策として、Elasticsearchレベルでこの動作を回避するために、すぐに使えるElasticsearchアナライザーに 「asciifolding」フィルター を追加することが可能です。

環境

  • Liferay DXP 7.0 - 7.3
  • Elasticsearch 2.x~7.x

カスタムアナライザーの作成

既存のアナライザーからカスタムアナライザーを作成するには、 Elasticsearch documentation からオリジナルの設定をコピーし、必要な変更を加える必要があります。

例えば、catalan analyzerを「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"
          ]
        }
      }
    }

変更します。

  1. "lowercase "と "catalan_stop "フィルターの間に "asciifolding "が追加されました。
  2. "catalan_keywords "セクションは、定義するキーワードがないため削除しました。
  3. 分析器の名前を「catalan」としたのは、既存の既成概念にとらわれない定義を上書きしたいからです。

カスタム・アナライザーの適用

カスタム・アナライザーをLiferayインデックスに適用する場合、アナライザーはインデックス作成時にしか変更できないため、Liferay側でアナライザーを設定する必要があります。 既存のインデックスに対して分析器を再定義することはできません。

作成したカスタム・アナライザーをLiferayインストールに適用するには、以下の手順に従います。

  1. コントロールパネル → 構成 → システム設定 を選択してください。
  2. Elasticsearch 6(またはElasticsearch 7)のエントリを探し(スクロールダウンして参照するか、検索ボックスを使用)、Actions(アクション)アイコンをクリックし、「Edit」をクリックします。
  3. 「Additional Index Configurations」 に移動して、カスタムアナライザーの入ったJSONフラグメントをそこにコピーします。
  • 注:このフィールドに既存の設定がある場合は、両方のJSON設定をマージする必要があります。
  • Save」をクリックします。
  • 新しいアナライザーを適用するために、 フルリインデックスを実行します。 DXP 7.1および7.2の場合はコントロールパネル → 設定 → 検索、DXP 7.3の場合はインデックスアクションタブ、DXP 7.0の場合はコントロールパネル → 設定 → サーバー管理に移動し、Reindex all search indexesの隣のExecuteをクリックします。
  • 重要:完全な再インデックスには長い時間がかかることがあり、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"
                ]
            }
        }
    }
    この記事は役に立ちましたか?
    6人中6人がこの記事が役に立ったと言っています