2017-05-17 3 views
1

Angenommen, enthält einen Index mit den folgenden Dokumenten haben (mit einem benutzerdefinierten tokenizer, die bei spaltet Zeichen „“)überprüfen Sie, ob Eingabe einen Feldwert als Teilzeichen

 "doc_1": { 
      "my_field": "aaa.bbb" 
     }, 
     "doc_2": { 
      "my_field": "ccc.ddd.eee" 
     } 

Ich brauche eine Abfrage zu machen, dass, wenn ich Geben Sie als Eingabe "fff.ggg.ccc.ddd.eee" gibt mich doc_2 als Treffer zurück. Wenn ich "hhh.bbb" oder "aaa.ggg.bbb.hhh" gebe, brauche ich keine Ergebnisse.

Irgendwelche Vorschläge?

+0

Haben Sie versucht, ein einfaches 'match' Abfrage? –

+0

Sie haben Recht, meine Frage war unvollständig. Bitte überprüfen Sie die neue Version. Danke für die Antwort :) – betto86

+1

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? –

Antwort

1

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" 
      } 
      } 
     } 
     } 
    } 
    } 
} 
  • Testdaten:
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" 
    } 
    } 
} 
Verwandte Themen