Genaue übereinstimmungen mit ElasticSearch (zum Zeitpunkt der Abfrage)
Habe ich eine Orte-index, die viele der Ortsnamen und Ihren jeweiligen Ländern.
Dann möchte ich wissen, ob wir haben Standorte mit dem Titel "Berlin" in das Land mit country code "DE".
Hier mein Java-code-Versuch:
SearchResponse response = client.prepareSearch("locations")
.setQuery(QueryBuilders.matchQuery("title", "Berlin"))
.setFilter(FilterBuilders.termFilter("country", "DE"))
.execute()
.actionGet();
Aber das gibt mir zu viele Antworten, z.B. Ergebnisse für "Zoo Berlin" und so weiter. Ich brauche genaue übereinstimmungen.
(Beachten Sie aber bitte, dass ich andere Szenarien, in denen diese Zeichenfolge/text search-matching gewünscht ist.)
Gibt es eine Möglichkeit, zu entscheiden, auf die Abfrage, und nicht an der Indizierung, die das Verhalten (exakt vs. analysierten text) man will?
- Durch exakte übereinstimmung, meinst du "berlin" sollte übereinstimmen "Berlin"?
- Ja, zum Beispiel. (Und ich kümmere mich nicht zu viel über den Fall hier.) Aber wenn "Berlin" passt zu "Berlin Hauptbahnhof", das ist problematisch.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Index das Feld ausführen ein Begriff, der filter auf als not_analyzed. Beispielsweise können Sie index das Feld "Land" als multi_field, mit einem der sub-Felder not_analyzed:
Zusätzlich, Sie könnte das gleiche tun mit dem "Titel" - Feld, um einen Begriff-Abfrage:
Dann zum Zeitpunkt der Abfrage, ob Sie möchten, dass ein Titel mit der genauen Bezeichnung "Berlin", gefiltert nach den genauen Begriff, "DE", einen Begriff-Abfrage-und-Sicht-filter mit der not_analyzed Felder:
Beachten Sie, dass Begriff filtern und Laufzeit Abfragen erfordern not_analyzed Bereichen zu arbeiten (z.B., um genaue übereinstimmungen zurückgeben).
Mit Version 5 + auf ElasticSearch gibt es kein Konzept von analysierten und nicht analysierten index, dessen Gefahren von Typ !
Datentyp "String" ist veraltet und wird ersetzt mit text und Keywords, so dass, wenn Ihr Datentyp ist text, es verhält sich wie string und können analysiert und tokenisiert.
Aber wenn die Datentyp ist definiert als Schlüsselwort dann automatisch seine NICHT analysiert, und kehren Sie voller exakte übereinstimmung.
ALSO Sie sollten nicht vergessen, markieren Sie die Art, wie ein Schlüsselwort, wenn Sie wollen, zu tun, genau passend.
und Sie können verwenden den gleichen Begriff, der Abfrage und Ausdruck filter, wie beschrieben von @Scott Reis.
code-Beispiel für das erstellen index mit dieser definition, Hinweis, dass ich erstellt habe, zwei Typen für jedes Feld eine als tokenizable so geben Sie text und andere genau so geben wird, Schlüsselwort, einige Male, Ihr nützlich zu halten, sowohl für bestimmte Felder: