sql >> Database teknologi >  >> RDS >> Mysql

Hvordan fuzzy matcher e-mail eller telefon af Elasticsearch?

En nem måde at gøre dette på er at oprette en brugerdefineret analysator, som gør brug af n-gram tokenfilter for e-mails (=> se nedenfor index_email_analyzer og search_email_analyzer + email_url_analyzer for nøjagtig e-mail-matching) og edge-ngram token-filter for telefoner (=> se nedenfor index_phone_analyzer og search_phone_analyzer ).

Den fulde indeksdefinition er tilgængelig nedenfor.

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

Lad os nu dissekere det ene stykke efter det andet.

Til phone felt, er ideen at indeksere telefonværdier med index_phone_analyzer , som bruger en edge-ngram tokenizer for at indeksere alle præfikser for telefonnummeret. Så hvis dit telefonnummer er 1362435647 , vil følgende tokens blive produceret:1 , 13 , 136 , 1362 , 13624 , 136243 , 1362435 , 13624356 , 13624356 , 136243564 , 1362435647 .

Når vi søger, bruger vi en anden analysator search_phone_analyzer som blot tager det indtastede nummer (f.eks. 136 ) og match den med phone felt ved hjælp af en simpel match eller term forespørgsel:

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

Til email feltet, fortsætter vi på lignende måde, idet vi indekserer e-mail-værdierne med index_email_analyzer , som bruger et ngram token-filter, som vil producere alle mulige tokens af varierende længde (mellem 1 og 20 tegn), der kan tages fra e-mail-værdien. For eksempel:[email protected] vil blive tokeniseret til j , jo , joh , ..., gmail.com , ..., [email protected] .

Når vi søger, bruger vi en anden analysator kaldet search_email_analyzer som vil tage inputtet og forsøge at matche det med de indekserede tokens.

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

email_url_analyzer analysator bruges ikke i dette eksempel, men jeg har inkluderet det, hvis du skal matche den nøjagtige e-mail-værdi.




  1. SQL DROP KOLONNE for begyndere

  2. Sådan forbinder du flere databaser i PHP, MYSQLi &PDO

  3. 4 typer oplysninger, der skal inkluderes i din CRM-database

  4. Brug af Offline Reorg Wizard