sql >> Database >  >> RDS >> Mysql

Hoe e-mail of telefoon fuzzy matchen door Elasticsearch?

Een gemakkelijke manier om dit te doen, is door een aangepaste analyser te maken die gebruikmaakt van de n-gram tokenfilter voor e-mails (=> zie hieronder index_email_analyzer en search_email_analyzer + email_url_analyzer voor exacte e-mailovereenkomst) en edge-ngram tokenfilter voor telefoons (=> zie hieronder index_phone_analyzer en search_phone_analyzer ).

De volledige indexdefinitie is hieronder beschikbaar.

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

Laten we het nu stukje bij beetje ontleden.

Voor de phone veld, is het de bedoeling om telefoonwaarden te indexeren met index_phone_analyzer , die een edge-ngram-tokenizer gebruikt om alle voorvoegsels van het telefoonnummer te indexeren. Dus als je telefoonnummer 1362435647 is , worden de volgende tokens geproduceerd:1 , 13 , 136 , 1362 , 13624 , 136243 , 1362435 , 13624356 , 13624356 , 136243564 , 1362435647 .

Dan gebruiken we bij het zoeken een andere analyzer search_phone_analyzer die gewoon het invoernummer zal aannemen (bijv. 136 ) en vergelijk het met de phone veld met behulp van een eenvoudige match of term vraag:

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

Voor de email veld, gaan we op een vergelijkbare manier te werk, in die zin dat we de e-mailwaarden indexeren met de index_email_analyzer , die een ngram-tokenfilter gebruikt, die alle mogelijke tokens van verschillende lengte (tussen 1 en 20 tekens) produceert die uit de e-mailwaarde kunnen worden gehaald. Bijvoorbeeld:[email protected] wordt tokenized naar j , jo , joh , ..., gmail.com , ..., [email protected] .

Bij het zoeken gebruiken we een andere analyser genaamd search_email_analyzer die de invoer zal nemen en proberen deze te matchen met de geïndexeerde tokens.

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

De email_url_analyzer analyzer wordt in dit voorbeeld niet gebruikt, maar ik heb het opgenomen voor het geval u de exacte e-mailwaarde wilt matchen.




  1. Hoe verwijder ik uitgebreide ASCII-tekens uit een tekenreeks in T-SQL?

  2. Hoe krijg ik een lijst met MySQL-weergaven?

  3. PostgreSQL-telling aantal keren dat subtekenreeks voorkomt in tekst

  4. Hoe de MySQL-fout 1064 op te lossen?