Multi-Feld, multi-word -, Spiel ohne query_string
Ich würde gerne in der Lage, mit einer multi-word-Suche mit mehreren Feldern, wo jedes Wort, das gesucht ist enthalten in alle der Felder, beliebige Kombination. Der Haken ist, ich möchte vermeiden Sie die Verwendung query_string.
curl -X POST "http://localhost:9200/index/document/1" -d '{"id":1,"firstname":"john","middlename":"clark","lastname":"smith"}'
curl -X POST "http://localhost:9200/index/document/2" -d '{"id":2,"firstname":"john","middlename":"paladini","lastname":"miranda"}'
Ich würde gerne die Suche für 'John Smith', um auf übereinstimmung nur Dokument 1. Die folgende Abfrage funktioniert, was ich brauche, aber ich hätte es lieber vermeiden, mit query_string im Fall übergibt der Benutzer "ODER", "UND" und die anderen advanced params.
curl -X GET 'http://localhost:9200/index/_search?per_page=10&pretty' -d '{
"query": {
"query_string": {
"query": "john smith",
"default_operator": "AND",
"fields": [
"firstname",
"lastname",
"middlename"
]
}
}
}'
- Ich komme immer auf diese Frage immer und immer und immer wieder. Große, immergrüne Frage!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was Sie suchen, ist die multi-match query, aber es nicht ganz so, wie Sie möchten.
Vergleichen Sie die Ausgabe von überprüfen für
multi_match
vsquery_string
.multi_match
(mit Betreiberand
) wird sicherstellen, dass ALLE Bedingungen vorhanden sind, die in mindestens einem Feld:Während
query_string
(mit default_operatorAND
) überprüfen, ob zu JEDEM Begriff existiert in mindestens einem Bereich:Also haben Sie ein paar Entscheidungen zu erreichen, was Sie nach sind:
Preparse die Suchbegriffe, Dinge zu entfernen, wie wildcards, etc, bevor Sie die
query_string
Preparse die Suchbegriffe zu extrahieren, jedes Wort, erzeugt dann eine
multi_match
Abfrage pro WortVerwenden
index_name
in deinem mapping für die name-Felder zu indizieren Ihre Daten in einem einzigen Feld, das Sie können, dann verwenden Sie für die Suche. (wie Sie Ihre eigenen benutzerdefiniertenall
Feld):Wie folgt:
Beachten Sie jedoch, dass
firstname
undlastname
sind nicht mehr durchsuchbar sind unabhängig voneinander. Die Daten für beide Felder die indiziert wurden, inname
.Könnten Sie multi-Felder mit der
path
parameter, Sie durchsuchbar zu machen sowohl unabhängig als auch gemeinsam, wie folgt:Suche im
any_name
- Feld funktioniert:Suche
firstname
fürjohn AND smith
funktioniert nicht:Aber auf der Suche
firstname
für nurjohn
korrekt funktioniert:In meiner Erfahrung, die Maskierung von Sonderzeichen mit dem backslash ist eine einfache und effektive Lösung. Die Liste finden Sie in der Dokumentation http://lucene.apache.org/core/4_5_0/queryparser/org/apache/lucene/queryparser/classic/package-summary.html#package_description -, plus-UND/ODER/NICHT/ZU.
Denke ich, dass "match" - Abfrage ist das, was Sie suchen:
"Das Spiel Familie von Abfragen geht nicht durch einen "query parsing" - Prozess. Es unterstützt keine Feldnamen Präfixe, wildcard-Zeichen, oder andere "erweiterte" Funktionen. Aus diesem Grund Chancen, dass es andernfalls sehr klein /nicht vorhanden, und es bietet einen hervorragendes Verhalten, wenn es um genau analysieren und ausführen, die text-als-query-Verhalten (das ist normalerweise das, was ein text-Suchfeld hat)"
http://www.elasticsearch.org/guide/reference/query-dsl/match-query.html
Heutzutage können Sie cross_fields geben
multi_match
Cross-Felder nehmen einen Begriff-zentrierten Ansatz. Es behandelt alle Felder zu einem großen Feld, und sieht für jeden Begriff in jedem Bereich.
Eine Sache zu beachten ist jedoch, dass, wenn Sie wollen, dass es optimal funktioniert, werden alle Felder analysiert werden, sollten die gleichen analyzer (standard, Englisch, etc.):