legacy-knowledge-base
公開されました Jul. 2, 2025

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

written-by

Jorge Diaz

How To articles are not official guidelines or officially supported documentation. They are community-contributed content and may not always reflect the latest updates to Liferay DXP. We welcome your feedback to improve How To articles!

While we make every effort to ensure this Knowledge Base is accurate, it may not always reflect the most recent updates or official guidelines.We appreciate your understanding and encourage you to reach out with any feedback or concerns.

legacy-article

learn-legacy-article-disclaimer-text

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

変更:

  1. "lowercase" と "catalan_stop" フィルターの間に "asciifolding" を追加しました。
  2. "catalan_keywords "セクションは、定義するキーワードがないため、削除しました。
  3. アナライザーの名前は、既存のデフォルト定義と同じ「catalan」としました。これは、それを上書きしたいからです。

カスタムアナライザーを適用する

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

Liferayのインストールでカスタムアナライザーを適用するには、以下のステップを実行します:

  1. コントロールパネル → 設定 → システム設定 に移動します。
  2. Elasticsearch 6(またはElasticsearch 7)のエントリーを見つけ(スクロールして参照するか、検索ボックスを使用)、アクションアイコン(Actions)、編集(Edit)の順でクリックします。
  3. "追加インデックス設定" にアクセスし、カスタムアナライザーを含む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"
            ]
        }
    }
}
did-this-article-resolve-your-issue

legacy-knowledge-base