Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да съпоставим размито имейл или телефон от Elasticsearch?

Лесен начин да направите това е да създадете персонализиран анализатор, който използва филтър за символи на n-gram за имейли (=> вижте по-долу index_email_analyzer и search_email_analyzer + email_url_analyzer за точно съвпадение на имейл) и edge-ngram филтър за маркери за телефони (=> вижте по-долу index_phone_analyzer и search_phone_analyzer ).

Пълната дефиниция на индекса е достъпна по-долу.

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

Сега нека го разчленим една след друга.

За phone поле, идеята е да се индексират телефонните стойности с index_phone_analyzer , който използва токенизатор на edge-ngram, за да индексира всички префикси на телефонния номер. Така че, ако телефонният ви номер е 1362435647 , ще бъдат произведени следните токени:1 , 13 , 136 , 1362 , 13624 , 136243 , 1362435 , 13624356 , 13624356 , 136243564 , 1362435647 .

След това при търсене използваме друг анализатор search_phone_analyzer който просто ще приеме входния номер (напр. 136 ) и го съпоставете с phone поле с помощта на просто match или term заявка:

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

За email поле, ние продължаваме по подобен начин, като индексираме имейл стойностите с index_email_analyzer , който използва филтър за токени ngram, който ще произведе всички възможни токени с различна дължина (между 1 и 20 символа), които могат да бъдат взети от стойността на имейла. Например:[email protected] ще бъде токенизиран до j , jo , joh , ..., gmail.com , ..., [email protected] .

След това, когато търсим, ще използваме друг анализатор, наречен search_email_analyzer който ще приеме входа и ще се опита да го съпостави с индексираните токени.

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

email_url_analyzer Анализаторът не се използва в този пример, но го включих само в случай, че трябва да съвпадате с точната стойност на имейла.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Свържете се с отдалечен MySQL сървър с SSL от PHP

  2. Laravel:свързвайте се с бази данни динамично

  3. Как да изчислим приходите в MySQL

  4. Обявяване на ClusterControl 1.7.5:Разширена поддръжка и поддръжка на клъстер за PostgreSQL 12 и MongoDB 4.2

  5. Библиотеката не е заредена:грешка libmysqlclient.16.dylib при опит за стартиране на 'rails server' на OS X 10.6 с mysql2 gem