Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie vergleiche ich E-Mail oder Telefon per Fuzzysearch mit Elasticsearch?

Eine einfache Möglichkeit, dies zu tun, besteht darin, einen benutzerdefinierten Analysator zu erstellen, der die N-Gramm-Tokenfilter für E-Mails (=> siehe unten index_email_analyzer und search_email_analyzer + email_url_analyzer für exakten E-Mail-Abgleich) und edge-ngram Token-Filter für Telefone (=> siehe unten index_phone_analyzer und search_phone_analyzer ).

Die vollständige Indexdefinition ist unten verfügbar.

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

Lassen Sie es uns nun Stück für Stück analysieren.

Für das phone Feld ist die Idee, Telefonwerte mit index_phone_analyzer zu indizieren , der einen Edge-Ngram-Tokenizer verwendet, um alle Präfixe der Telefonnummer zu indizieren. Wenn Ihre Telefonnummer also 1362435647 ist , werden die folgenden Token erzeugt:1 , 13 , 136 , 1362 , 13624 , 136243 , 1362435 , 13624356 , 13624356 , 136243564 , 1362435647 .

Dann verwenden wir bei der Suche einen anderen Analysator search_phone_analyzer die einfach die eingegebene Nummer nimmt (z. B. 136 ) und mit dem phone abgleichen Feld mit einem einfachen match oder term Abfrage:

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

Für die email gehen wir ähnlich vor, indem wir die E-Mail-Werte mit dem index_email_analyzer indizieren , der einen Ngram-Token-Filter verwendet, der alle möglichen Token unterschiedlicher Länge (zwischen 1 und 20 Zeichen) erzeugt, die aus dem E-Mail-Wert entnommen werden können. Zum Beispiel:[email protected] wird in j tokenisiert , jo , joh , ..., gmail.com , ..., [email protected] .

Bei der Suche verwenden wir dann einen anderen Analysator namens search_email_analyzer die die Eingabe nimmt und versucht, sie mit den indizierten Token abzugleichen.

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

Der email_url_analyzer Der Analysator wird in diesem Beispiel nicht verwendet, aber ich habe ihn nur für den Fall eingefügt, dass Sie den genauen E-Mail-Wert abgleichen müssen.