Aufgrund der bereitgestellten Informationen das ist meine Lösung:
- ein benutzerdefinierter Analysator nur bei Suchzeit, die die Eingabe in eine Abfrage angegeben wird
shingle
. Um Ihre bestehenden Mappings nicht zu stören, habe ich ein Unterfeld mit dem Namen keyword
für diesen Zweck erstellt und einen keyword
Analyzer zur Indexierungszeit verwendet (wenn Sie etwas Groß-/Kleinschreibung benötigen, ändern Sie diesen Analyzer entsprechend) und meinen Shingle Analyzer zur Suchzeit :
DELETE test
PUT /test
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "my_tokenizer",
"filter": [
"shingle"
]
}
},
"tokenizer": {
"my_tokenizer": {
"type": "pattern",
"pattern": "\\."
}
},
"filter": {
"shingle": {
"type": "shingle",
"min_shingle_size": 2,
"max_shingle_size": 3,
"output_unigrams": false,
"token_separator":"."
}
}
}
},
"mappings": {
"test": {
"properties": {
"my_field": {
"type": "text",
"fields": {
"keyword": {
"type": "text",
"analyzer": "keyword",
"search_analyzer": "my_analyzer"
}
}
}
}
}
}
}
POST /test/test/1
{
"my_field": "aaa.bbb"
}
POST /test/test/2
{
"my_field": "ccc.ddd.eee"
}
- zum Zeitpunkt der Abfrage verwendet I ein einfaches
match
(das wird die Suchzeit-Analysator halte ich in der Mapping-Definition) und passen gegen die keyword
ed Werte von meinem .keyword
Unterfeld:
GET /test/_search
{
"query": {
"match": {
"my_field.keyword": "fff.ggg.ccc.ddd.eee"
}
}
}
GET /test/_search
{
"query": {
"match": {
"my_field.keyword": "aaa.ggg.bbb.hhh"
}
}
}
GET /test/_search
{
"query": {
"match": {
"my_field.keyword": "hhh.bbb"
}
}
}
GET /test/_search
{
"query": {
"match": {
"my_field.keyword": "ccc.ddd"
}
}
}
Haben Sie versucht, ein einfaches 'match' Abfrage? –
Sie haben Recht, meine Frage war unvollständig. Bitte überprüfen Sie die neue Version. Danke für die Antwort :) – betto86
Nun, es ist jetzt besser ;-). Aber es bedarf noch weiterer Überlegungen. 'ccc.ddd.eee' stimmt genau mit Ihrem Feld überein (wenn Sie nach' "fff.ggg.ccc.ddd.eee" ') suchen, aber was ist mit einer Suche nach' ccc.ddd'? Sollte passen oder nicht? –