Een gemakkelijke manier om dit te doen, is door een aangepaste analyser te maken die gebruikmaakt van de n-gram tokenfilter
voor e-mails (=> zie hieronder index_email_analyzer
en search_email_analyzer
+ email_url_analyzer
voor exacte e-mailovereenkomst) en edge-ngram tokenfilter
voor telefoons (=> zie hieronder index_phone_analyzer
en search_phone_analyzer
).
De volledige indexdefinitie is hieronder beschikbaar.
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"
}
}
}
}
}
Laten we het nu stukje bij beetje ontleden.
Voor de phone
veld, is het de bedoeling om telefoonwaarden te indexeren met index_phone_analyzer
, die een edge-ngram-tokenizer gebruikt om alle voorvoegsels van het telefoonnummer te indexeren. Dus als je telefoonnummer 1362435647
is , worden de volgende tokens geproduceerd:1
, 13
, 136
, 1362
, 13624
, 136243
, 1362435
, 13624356
, 13624356
, 136243564
, 1362435647
.
Dan gebruiken we bij het zoeken een andere analyzer search_phone_analyzer
die gewoon het invoernummer zal aannemen (bijv. 136
) en vergelijk het met de phone
veld met behulp van een eenvoudige match
of term
vraag:
POST myindex
{
"query": {
"term":
{ "phone": "136" }
}
}
Voor de email
veld, gaan we op een vergelijkbare manier te werk, in die zin dat we de e-mailwaarden indexeren met de index_email_analyzer
, die een ngram-tokenfilter gebruikt, die alle mogelijke tokens van verschillende lengte (tussen 1 en 20 tekens) produceert die uit de e-mailwaarde kunnen worden gehaald. Bijvoorbeeld:[email protected]
wordt tokenized naar j
, jo
, joh
, ..., gmail.com
, ..., [email protected]
.
Bij het zoeken gebruiken we een andere analyser genaamd search_email_analyzer
die de invoer zal nemen en proberen deze te matchen met de geïndexeerde tokens.
POST myindex
{
"query": {
"term":
{ "email": "@gmail.com" }
}
}
De email_url_analyzer
analyzer wordt in dit voorbeeld niet gebruikt, maar ik heb het opgenomen voor het geval u de exacte e-mailwaarde wilt matchen.