En nem måde at gøre dette på er at oprette en brugerdefineret analysator, som gør brug af n-gram tokenfilter
for e-mails (=> se nedenfor index_email_analyzer
og search_email_analyzer
+ email_url_analyzer
for nøjagtig e-mail-matching) og edge-ngram token-filter
for telefoner (=> se nedenfor index_phone_analyzer
og search_phone_analyzer
).
Den fulde indeksdefinition er tilgængelig nedenfor.
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"
}
}
}
}
}
Lad os nu dissekere det ene stykke efter det andet.
Til phone
felt, er ideen at indeksere telefonværdier med index_phone_analyzer
, som bruger en edge-ngram tokenizer for at indeksere alle præfikser for telefonnummeret. Så hvis dit telefonnummer er 1362435647
, vil følgende tokens blive produceret:1
, 13
, 136
, 1362
, 13624
, 136243
, 1362435
, 13624356
, 13624356
, 136243564
, 1362435647
.
Når vi søger, bruger vi en anden analysator search_phone_analyzer
som blot tager det indtastede nummer (f.eks. 136
) og match den med phone
felt ved hjælp af en simpel match
eller term
forespørgsel:
POST myindex
{
"query": {
"term":
{ "phone": "136" }
}
}
Til email
feltet, fortsætter vi på lignende måde, idet vi indekserer e-mail-værdierne med index_email_analyzer
, som bruger et ngram token-filter, som vil producere alle mulige tokens af varierende længde (mellem 1 og 20 tegn), der kan tages fra e-mail-værdien. For eksempel:[email protected]
vil blive tokeniseret til j
, jo
, joh
, ..., gmail.com
, ..., [email protected]
.
Når vi søger, bruger vi en anden analysator kaldet search_email_analyzer
som vil tage inputtet og forsøge at matche det med de indekserede tokens.
POST myindex
{
"query": {
"term":
{ "email": "@gmail.com" }
}
}
email_url_analyzer
analysator bruges ikke i dette eksempel, men jeg har inkluderet det, hvis du skal matche den nøjagtige e-mail-værdi.