Eine einfache Möglichkeit, dies zu tun, besteht darin, einen benutzerdefinierten Analysator zu erstellen, der die N-Gramm-Tokenfilter
für E-Mails (=> siehe unten index_email_analyzer
und search_email_analyzer
+ email_url_analyzer
für exakten E-Mail-Abgleich) und edge-ngram Token-Filter
für Telefone (=> siehe unten index_phone_analyzer
und search_phone_analyzer
).
Die vollständige Indexdefinition ist unten verfügbar.
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"
}
}
}
}
}
Lassen Sie es uns nun Stück für Stück analysieren.
Für das phone
Feld ist die Idee, Telefonwerte mit index_phone_analyzer
zu indizieren , der einen Edge-Ngram-Tokenizer verwendet, um alle Präfixe der Telefonnummer zu indizieren. Wenn Ihre Telefonnummer also 1362435647
ist , werden die folgenden Token erzeugt:1
, 13
, 136
, 1362
, 13624
, 136243
, 1362435
, 13624356
, 13624356
, 136243564
, 1362435647
.
Dann verwenden wir bei der Suche einen anderen Analysator search_phone_analyzer
die einfach die eingegebene Nummer nimmt (z. B. 136
) und mit dem phone
abgleichen Feld mit einem einfachen match
oder term
Abfrage:
POST myindex
{
"query": {
"term":
{ "phone": "136" }
}
}
Für die email
gehen wir ähnlich vor, indem wir die E-Mail-Werte mit dem index_email_analyzer
indizieren , der einen Ngram-Token-Filter verwendet, der alle möglichen Token unterschiedlicher Länge (zwischen 1 und 20 Zeichen) erzeugt, die aus dem E-Mail-Wert entnommen werden können. Zum Beispiel:[email protected]
wird in j
tokenisiert , jo
, joh
, ..., gmail.com
, ..., [email protected]
.
Bei der Suche verwenden wir dann einen anderen Analysator namens search_email_analyzer
die die Eingabe nimmt und versucht, sie mit den indizierten Token abzugleichen.
POST myindex
{
"query": {
"term":
{ "email": "@gmail.com" }
}
}
Der email_url_analyzer
Der Analysator wird in diesem Beispiel nicht verwendet, aber ich habe ihn nur für den Fall eingefügt, dass Sie den genauen E-Mail-Wert abgleichen müssen.