2017-08-04 5 views
1

Verwenden their data auf Elasticsearch Tutorials als Beispiel die folgende uri Suchtreffer Aufzeichnungen,Elasticsearch Abfrage mit Wildcards

curl -XGET 'remotehost:9200/bank/_search?q=city:R*d&_source_include=city&pretty&pretty' 

während der folgenden reques Leibesvisitation Datensätze trifft,

curl -XGET 'remotehost:9200/bank/_search?pretty' -H 'Content-Type: application/json' 
-d'{"query": {"wildcard": {"city": "R*d"} }, 
"_source": ["city"] 
} 
' 

Aber die beiden Methoden sollten einander gleichwertig sein. Irgendeine Idee, warum das passiert? Ich benutze Elasticsearch 5.5.1 in Docker.

+0

Hat meine Antwort Ihnen nicht geholfen? – sunkuet02

+0

@ sunkuet02 Es ist hilfreich, danke! Dies macht jedoch die beiden Suchmethoden (intuitiv) inkonsistent. Weißt du, ob ich irgendetwas mit der Datenbank machen kann, so dass beide Methoden nicht das "Schlüsselwort" benötigen, oder beide das "Schlüsselwort" benötigen? – Luke

+0

Ich habe meine Antwort aktualisiert. Bitte überprüfen Sie es, hoffe es hilft. Und vergessen Sie nicht, meine Antwort zu verbessern und zu akzeptieren, es hilft. – sunkuet02

Antwort

1

Sie können Ihr erwartetes Ergebnis erhalten, indem Sie den folgenden Befehl ausführen. Diese Befehle fügen ein zusätzliches .keyword mit Ihrem Befehl in Feld city hinzu.

curl -XGET 'localhost:9200/bank/_search?pretty' -H 'Content-Type: application/json' -d'{"query": {"wildcard": {"city.keyword": "R*d"} }, "_source": ["city"]}' 

Grund des Hinzufügens .keyword

Wenn Sie Daten einfügen, um Elasticsearch, werden Sie ein .keyword Feld bemerken und das Feld ist not_analyzed. Standardmäßig wird das Feld, in das Sie Daten eingefügt haben, standardmäßig analysiert, und es gibt ein Multifeld .keyword. Wenn Sie ein Feld city mit Daten erstellen, wird ein Feld city mit Standardanalysator erstellt und ein Multifeld .keyword hinzugefügt, das not_analyzed ist.

In Ihrem Fall benötigen Sie ein not_analyzed Feld zur Abfrage (wie wildcard Abfrage). Ihre Abfrage sollte also auf city.keyword Feld sein, das standardmäßig nicht analysis ist.

Im ersten Fall haben Sie eine Get-Anforderung an elasticsearch mit Abfrageparameter getroffen. Elasticsearch konvertiert die Abfrage automatisch als zweites Format.

Für eine zuverlässige Quelle, können Sie die Official docs

Das string Feld in zwei neue Arten aufgespalten hat folgen: text, die für Volltextsuche verwendet werden soll, und keyword, die verwendet werden sollte, Stichwortsuche.

Um die Dinge besser zu machen, Elasticsearch beschlossen, eine Idee zu borgen, dass zunächst von Logstash stammten: Strings werden nun sowohl als text und keyword standardmäßig zugeordnet werden. die folgenden einfachen Dokument Zum Beispiel, wenn Sie Index:

{ 
    "foo": "bar" 
} 

Dann werden die folgenden dynamischen Zuordnungen werden erstellt:

{ 
    "foo": { 
    "type" "text", 
    "fields": { 
     "keyword": { 
     "type": "keyword", 
     "ignore_above": 256 
     } 
    } 
    } 
} 

Als Folge wird es sowohl möglich sein, Volltextsuche auf foo und Stichwortsuche und Aggregationen mit der foo.keyword durchzuführen Feld.

+0

Können Sie eine Quelle/einen Verweis auf den Kommentar angeben, dass "Elasticsearch die" URI-Abfrage automatisch mit ".keyword" in die Body-Abfrage konvertiert? – Luke

+0

@Luke, Sobald ich es gelesen habe. Ich werde Ihnen den Link in wenigen Minuten geben – sunkuet02

+0

@Luke, würden Sie bitte überprüfen Sie den Link: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string- query.html im Abschnitt 'allow_leading_wildcard' Ich denke, du wirst deine Antwort in diesem offiziellen Blog finden – sunkuet02