Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak dopasować rozmyty adres e-mail lub telefon przez Elasticsearch?

Prostym sposobem na to jest stworzenie własnego analizatora, który korzysta z filtr tokenów n-gram dla e-maili (=> patrz poniżej index_email_analyzer i search_email_analyzer + email_url_analyzer dla dokładnego dopasowania e-maili) i edge-ngram filtr tokenów dla telefonów (=> patrz poniżej index_phone_analyzer i search_phone_analyzer ).

Pełna definicja indeksu jest dostępna poniżej.

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

Teraz przyjrzyjmy się temu kawałek po kawałku.

Dla phone pole, pomysł polega na indeksowaniu wartości telefonu za pomocą index_phone_analyzer , który używa tokenizera edge-ngram w celu indeksowania wszystkich prefiksów numeru telefonu. Więc jeśli Twój numer telefonu to 1362435647 , zostaną wygenerowane następujące tokeny:1 , 13 , 136 , 1362 , 13624 , 136243 , 1362435 , 13624356 , 13624356 , 136243564 , 1362435647 .

Następnie podczas wyszukiwania używamy innego analizatora search_phone_analyzer który po prostu przyjmie numer wejściowy (np. 136 ) i dopasuj go do phone pole za pomocą prostego match lub term zapytanie:

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

Dla email w polu, postępujemy w podobny sposób, w którym wartości e-mail indeksujemy za pomocą index_email_analyzer , który wykorzystuje filtr tokenów ngram, który wygeneruje wszystkie możliwe tokeny o różnej długości (od 1 do 20 znaków), które można pobrać z wartości wiadomości e-mail. Na przykład:[email protected] zostanie ztokenizowany do j , jo , joh , ..., gmail.com , ..., [email protected] .

Następnie podczas wyszukiwania użyjemy innego analizatora o nazwie search_email_analyzer który pobierze dane wejściowe i spróbuje dopasować je do zindeksowanych tokenów.

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

email_url_analyzer Analizator nie jest używany w tym przykładzie, ale dodałem go na wypadek, gdybyś musiał dopasować dokładną wartość adresu e-mail.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wprowadzenie do poleceń SQL

  2. Hybrydowa replikacja w chmurze dla MySQL w celu zapewnienia wysokiej dostępności

  3. Zapytanie UNION ze wzorcem aktywnego rekordu kodeignitera

  4. MySQL wybierz szybko 10 losowych wierszy z 600 000 wierszy

  5. MYSQL sum() dla różnych wierszy