sql >> データベース >  >> RDS >> Mysql

Elasticsearchでメールや電話をあいまい一致させる方法は?

    これを行う簡単な方法は、n-gramトークンフィルター メールの場合(=>以下のindex_email_analyzerを参照 およびsearch_email_analyzer + email_url_analyzer 正確なメール照合用)および edge-ngramトークンフィルター 電話の場合(=>以下のindex_phone_analyzerを参照 および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"
            }
          }
        }
      }
    }
    

    それでは、次々と分析していきましょう。

    phoneの場合 フィールドでは、index_phone_analyzerを使用して電話の値にインデックスを付けるというアイデアがあります 、電話番号のすべてのプレフィックスにインデックスを付けるために、edge-ngramトークナイザーを使用します。したがって、電話番号が1362435647の場合 、次のトークンが生成されます:113136136213624136243136243513624356136243561362435641362435647

    次に、検索するときに別のアナライザーsearch_phone_analyzerを使用します 入力番号を取得するだけです(例:136 )そしてそれをphoneと照合します 単純なmatchを使用したフィールド またはterm クエリ:

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

    emailの場合 フィールドでは、index_email_analyzerを使用してメール値にインデックスを付けるという点で同様の方法で処理します。 、ngramトークンフィルターを使用します。これにより、電子メールの値から取得できるさまざまな長さ(1〜20文字)のすべての可能なトークンが生成されます。例:[email protected] jにトークン化されます 、jojoh 、...、gmail.com 、...、[email protected]

    次に、検索するときに、search_email_analyzerという別のアナライザーを使用します これは入力を受け取り、それをインデックス付きトークンと照合しようとします。

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

    email_url_analyzer この例ではアナライザーは使用されていませんが、正確な電子メール値を一致させる必要がある場合に備えて、アナライザーを含めました。




    1. Spring JpaRepositoryで疑問符(?)文字をエスケープする方法

    2. MySQLで小文字を大文字に変換する方法

    3. MySQLでユーザーを作成する方法

    4. Oracleで2つの列の比較を1つの列として選択する方法