Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm cách nào để so khớp mờ email hoặc điện thoại bằng Elasticsearch?

Một cách dễ dàng để thực hiện việc này là tạo một trình phân tích tùy chỉnh sử dụng bộ lọc mã thông báo n-gram cho email (=> xem bên dưới index_email_analyzersearch_email_analyzer + email_url_analyzer để đối sánh email chính xác) và edge-ngram bộ lọc mã thông báo dành cho điện thoại (=> xem bên dưới index_phone_analyzersearch_phone_analyzer ).

Định nghĩa chỉ mục đầy đủ có sẵn bên dưới.

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

Bây giờ, chúng ta hãy mổ xẻ nó lần lượt.

Đối với phone , ý tưởng là lập chỉ mục các giá trị điện thoại với index_phone_analyzer , sử dụng một trình mã hóa cạnh ngram để lập chỉ mục tất cả các tiền tố của số điện thoại. Vì vậy, nếu số điện thoại của bạn là 1362435647 , các mã thông báo sau sẽ được tạo:1 , 13 , 136 , 1362 , 13624 , 136243 , 1362435 , 13624356 , 13624356 , 136243564 , 1362435647 .

Sau đó, khi tìm kiếm, chúng tôi sử dụng một trình phân tích khác search_phone_analyzer mà sẽ chỉ lấy số đầu vào (ví dụ:136 ) và đối sánh nó với phone trường sử dụng match đơn giản hoặc term truy vấn:

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

Đối với email , chúng tôi tiến hành theo cách tương tự, trong đó chúng tôi lập chỉ mục các giá trị email bằng index_email_analyzer , sử dụng bộ lọc mã thông báo ngram, sẽ tạo ra tất cả các mã thông báo có thể có độ dài khác nhau (từ 1 đến 20 ký tự) có thể được lấy từ giá trị email. Ví dụ:[email protected] sẽ được mã hóa thành j , jo , joh , ..., gmail.com , ..., [email protected] .

Sau đó, khi tìm kiếm, chúng tôi sẽ sử dụng một trình phân tích khác có tên là search_email_analyzer sẽ lấy dữ liệu đầu vào và cố gắng khớp nó với các mã thông báo đã được lập chỉ mục.

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

email_url_analyzer analyzer không được sử dụng trong ví dụ này nhưng tôi đã bao gồm nó chỉ trong trường hợp bạn cần khớp với giá trị email chính xác.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để thay đổi kiểu dữ liệu cho một cột trong MySQL?

  2. .NET Core 2.1 Identity nhận tất cả người dùng với các vai trò liên quan của họ

  3. Xuất cơ sở dữ liệu MySQL / MariaDB

  4. Chọn dữ liệu giữa một phạm vi ngày / giờ

  5. Lỗi MySQL 1449:Người dùng được chỉ định làm trình xác định không tồn tại