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_analyzer
và search_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_analyzer
và search_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.