sql >> Databáze >  >> RDS >> Mysql

Jak fuzzy spárovat e-mail nebo telefon pomocí Elasticsearch?

Snadný způsob, jak toho dosáhnout, je vytvořit vlastní analyzátor, který využívá filtr tokenů n-gram pro e-maily (=> viz níže index_email_analyzer a search_email_analyzer + email_url_analyzer pro přesnou shodu e-mailů) a edge-ngram filtr tokenů pro telefony (=> viz níže index_phone_analyzer a search_phone_analyzer ).

Úplná definice indexu je k dispozici níže.

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

Pojďme to teď rozebrat jeden kousek po druhém.

Pro phone Cílem je indexovat telefonní hodnoty pomocí index_phone_analyzer , který používá edge-ngram tokenizer k indexování všech předpon telefonního čísla. Pokud je tedy vaše telefonní číslo 1362435647 , budou vytvořeny následující tokeny:1 , 13 , 136 , 1362 , 13624 , 136243 , 1362435 , 13624356 , 13624356 , 136243564 , 1362435647 .

Při vyhledávání pak používáme jiný analyzátor search_phone_analyzer který jednoduše převezme vstupní číslo (např. 136 ) a porovnejte jej s phone pole pomocí jednoduchého match nebo term dotaz:

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

Pro email pole, postupujeme obdobným způsobem, že hodnoty e-mailu indexujeme pomocí index_email_analyzer , který používá filtr tokenů ngram, který vytvoří všechny možné tokeny různé délky (mezi 1 a 20 znaky), které lze převzít z hodnoty e-mailu. Například:[email protected] bude tokenizováno na j , jo , joh , ..., gmail.com , ..., [email protected] .

Poté při vyhledávání použijeme další analyzátor s názvem search_email_analyzer který převezme vstup a pokusí se jej porovnat s indexovanými tokeny.

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

email_url_analyzer V tomto příkladu není použit analyzátor, ale zahrnul jsem jej pro případ, že byste potřebovali porovnat přesnou hodnotu e-mailu.




  1. SQLiteException pomocí WHERE +KEY_Date+='+date+'

  2. Provádění více SQL dotazů v jednom příkazu pomocí PHP

  3. Převeďte formát data na formát DD/MMM/RRRR na serveru SQL

  4. 7 způsobů, jak vrátit všechny tabulky s primárním klíčem na SQL Server