sql >> Databasteknik >  >> RDS >> Mysql

Hur fuzzy matchar e-post eller telefon av Elasticsearch?

Ett enkelt sätt att göra detta är att skapa en anpassad analysator som använder n-gram tokenfilter för e-postmeddelanden (=> se nedan index_email_analyzer och search_email_analyzer + email_url_analyzer för exakt e-postmatchning) och edge-ngram tokenfilter för telefoner (=> se nedan index_phone_analyzer och search_phone_analyzer ).

Den fullständiga indexdefinitionen finns tillgänglig nedan.

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

Låt oss nu dissekera den ena biten efter den andra.

För phone fältet är tanken att indexera telefonvärden med index_phone_analyzer , som använder en edge-ngram tokenizer för att indexera alla prefix för telefonnumret. Så om ditt telefonnummer är 1362435647 , kommer följande tokens att produceras:1 , 13 , 136 , 1362 , 13624 , 136243 , 1362435 , 13624356 , 13624356 , 136243564 , 1362435647 .

När vi sedan söker använder vi en annan analysator search_phone_analyzer som helt enkelt tar det inmatade numret (t.ex. 136 ) och matcha den mot phone fält med en enkel match eller term fråga:

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

För email fältet fortsätter vi på liknande sätt, genom att vi indexerar e-postvärdena med index_email_analyzer , som använder ett ngram-tokenfilter, som kommer att producera alla möjliga tokens av varierande längd (mellan 1 och 20 tecken) som kan tas från e-postvärdet. Till exempel:[email protected] kommer att tokeniseras till j , jo , joh , ..., gmail.com , ..., [email protected] .

När vi sedan söker använder vi en annan analysator som heter search_email_analyzer som tar ingången och försöker matcha den mot de indexerade tokens.

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

email_url_analyzer analysator används inte i det här exemplet men jag har inkluderat det ifall du behöver matcha det exakta e-postvärdet.




  1. Hur man skapar en databasmodell från grunden

  2. Hur exporterar jag frågeresultat till csv i Oracle SQL Developer?

  3. Oracle Cloud Breakdown – Databas Hosting Costs on OCI

  4. Ytterligare ett 12c Optimizer-vitbok