Лесен начин да направите това е да създадете персонализиран анализатор, който използва филтър за символи на 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 символа), които могат да бъдат взети от стойността на имейла. Например:example@sqldat.com ще бъде токенизиран до j , jo , joh , ..., gmail.com , ..., example@sqldat.com .
След това, когато търсим, ще използваме друг анализатор, наречен search_email_analyzer който ще приеме входа и ще се опита да го съпостави с индексираните токени.
POST myindex
{
"query": {
"term":
{ "email": "@gmail.com" }
}
}
email_url_analyzer Анализаторът не се използва в този пример, но го включих само в случай, че трябва да съвпадате с точната стойност на имейла.