Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

Elasticsearch द्वारा ईमेल या टेलीफ़ोन का फ़ज़ी मिलान कैसे करें?

ऐसा करने का एक आसान तरीका एक कस्टम विश्लेषक बनाना है जो n-ग्राम टोकन फ़िल्टर ईमेल के लिए (=> नीचे देखें 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 . के साथ अनुक्रमित करना है , जो फ़ोन नंबर के सभी उपसर्गों को अनुक्रमित करने के लिए एक एज-एनग्राम टोकननाइज़र का उपयोग करता है। तो अगर आपका फ़ोन नंबर 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 के साथ अनुक्रमित करते हैं , जो एक एनग्राम टोकन फिल्टर का उपयोग करता है, जो अलग-अलग लंबाई (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. मुझे PHP में mysql_* फ़ंक्शन का उपयोग क्यों नहीं करना चाहिए?

  2. MySQL में लोड डेटा इनफाइल के लिए एक्सेस अस्वीकृत

  3. MySQL और JDBC पुनर्लेखन के साथBatchedStatements=true

  4. पीएचपी पीडीओ तैयार बयान -- MySQL क्वेरी पसंद है

  5. प्रत्येक समूह में अंतिम रिकॉर्ड प्राप्त करना - MySQL