ホームページ  >  記事  >  データベース  >  Elasticsearch でメールと電話番号のあいまい一致を最適化するにはどうすればよいですか?

Elasticsearch でメールと電話番号のあいまい一致を最適化するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-30 15:51:02422ブラウズ

How to Optimize Fuzzy Matching of Emails and Phone Numbers in Elasticsearch?

Elasticsearch でのメールと電話番号のあいまい一致

Elasticsearch は、メールや電話番号などのデータのあいまい一致のための柔軟な方法を提供します。この記事では、カスタム アナライザーとトークン フィルターを使用して、そのようなクエリのパフォーマンスを最適化する方法について説明します。

ファジー マッチング用のカスタム アナライザー

電子メールと電話番号を効率的にファジー マッチングするには、 Elasticsearch でカスタム アナライザーを作成することをお勧めします。これらのアナライザーは、分析用の入力データを準備するトークナイザーと、特定の変換を実行するフィルターのセットで構成されます。

Email Analyzer

index_email_analyzer アナライザーは、標準のトークナイザーを利用して、入力を分解します。次に、小文字、name_ngram_filter、trim などのフィルターを適用して電子メールを小文字に変換し、さまざまな長さ (3 ~ 20 文字) の ngram を生成し、スペースを削除します。

search_email_analyzer は同様に標準トークナイザーを使用しますが、小文字フィルターとトリムフィルターのみを使用します。これにより、検索用の入力が準備され、ngram フィルターは必要ありません。

Phone Analyzer

電話番号の場合、index_phone_analyzer は digit_edge_ngram_tokenizer を利用して、さまざまな長さの ngram を生成します。数字で始まる (1 ~ 15 文字)。これにより、電話番号の任意のプレフィックスとの照合が可能になります。 digit_only char フィルタは、数字以外の文字を削除して、数値のみが分析されるようにします。

search_phone_analyzer は、入力から単一のトークンを生成するキーワード トークナイザーを使用し、電話番号の正確な一致を可能にします。

アナライザーの実装

これらのカスタム アナライザーを組み込んだサンプル マッピングを次に示します。

PUT myindex
{
  "settings": {
    "analysis": {
      "analyzer": {
        "email_url_analyzer": {
          "type": "custom",
          "tokenizer": "uax_url_email",
          "filter": [ "trim" ]
        },
        "index_phone_analyzer": {
          "type": "custom",
          "char_filter": [ "digit_only" ],
          "tokenizer": "digit_edge_ngram_tokenizer",
          "filter": [ "trim" ]
        },
        "search_phone_analyzer": {
          "type": "custom",
          "char_filter": [ "digit_only" ],
          "tokenizer": "keyword",
          "filter": [ "trim" ]
        },
        "index_email_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [ "lowercase", "name_ngram_filter", "trim" ]
        },
        "search_email_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [ "lowercase", "trim" ]
        }
      },
      "char_filter": {
        "digit_only": {
          "type": "pattern_replace",
          "pattern": "\D+",
          "replacement": ""
        }
      },
      "tokenizer": {
        "digit_edge_ngram_tokenizer": {
          "type": "edgeNGram",
          "min_gram": "1",
          "max_gram": "15",
          "token_chars": [ "digit" ]
        }
      },
      "filter": {
        "name_ngram_filter": {
          "type": "ngram",
          "min_gram": "1",
          "max_gram": "20"
        }
      }
    }
  },
  "mappings": {
    "your_type": {
      "properties": {
        "email": {
          "type": "string",
          "analyzer": "index_email_analyzer",
          "search_analyzer": "search_email_analyzer"
        },
        "phone": {
          "type": "string",
          "analyzer": "index_phone_analyzer",
          "search_analyzer": "search_phone_analyzer"
        }
      }
    }
  }
}

ファジー クエリの実行

「@gmail.com」で終わる電子メールまたは「136」で始まる電話番号を照合するには、次のようなクエリを発行できます。

POST myindex
{
  "query": {
    "term": {
      "email": "@gmail.com"
    }
  }
}

POST myindex
{
  "query": {
    "term": {
      "phone": "136"
    }
  }
}

これらのクエリはカスタム アナライザーを活用して、ファジーに必要な Ngram を生成します。一致します。

以上がElasticsearch でメールと電話番号のあいまい一致を最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。