Elasticsearch: Unterschied zwischen "Term", "Match Phrase" und "Query String"

116

Neu bei Elasticsearch und der Versuch, den Unterschied zwischen diesen Abfragen besser zu verstehen. Soweit ich das beurteilen kann, termstimmt dies mit einem einzelnen Begriff überein (muss in Kleinbuchstaben geschrieben werden, damit die Übereinstimmung funktioniert?) Und mit beiden match phraseund query stringeiner Textfolge.

blee908
quelle

Antworten:

226

termDie Abfrage entspricht einem einzelnen Begriff: Der Wert wird nicht analysiert . Es muss also nicht in Kleinbuchstaben geschrieben werden, je nachdem, was Sie indiziert haben.

Wenn Sie Bennettzum Indexzeitpunkt angegeben haben und der Wert nicht analysiert wird, gibt die folgende Abfrage nichts zurück:

{
  "query": {
    "term" : { "user" : "bennett" }
  }
}

match_phrase Die Abfrage analysiert die Eingabe, wenn Analysatoren für das abgefragte Feld definiert sind, und findet Dokumente, die den folgenden Kriterien entsprechen:

  • Alle Begriffe müssen im Feld erscheinen
  • Sie müssen dieselbe Reihenfolge wie der Eingabewert haben

Wenn Sie beispielsweise die folgenden Dokumente indizieren (mit dem standardAnalysator für das Feld foo):

{ "foo":"I just said hello world" }

{ "foo":"Hello world" }

{ "foo":"World Hello" }

Diese match_phraseAbfrage gibt nur das erste und das zweite Dokument zurück:

{
  "query": {
    "match_phrase": {
      "foo": "Hello World"
    }
  }
}

query_stringAbfragesuche standardmäßig in einem _all- Feld, das den Text mehrerer Textfelder gleichzeitig enthält. Darüber hinaus wird es analysiert und unterstützt einige Operatoren (AND / OR ...), Platzhalter usw. (siehe zugehörige Syntax) ).

Während der match_phraseAbfragen wird die Eingabe gemäß dem auf dem abgefragten Feld eingestellten Analysator analysiert.

Im Gegensatz zu müssen die match_phrasenach der Analyse erhaltenen Begriffe nicht in derselben Reihenfolge sein, es sei denn, der Benutzer hat Anführungszeichen um die Eingabe verwendet.

Wenn Sie beispielsweise dieselben Dokumente wie zuvor verwenden, werden bei dieser Abfrage alle Dokumente zurückgegeben:

{
  "query": {
    "query_string": {
      "query": "hello World"
    }
  }
}

Diese Abfrage gibt jedoch dieselben 2 Dokumente wie die match_phraseAbfrage zurück:

{
  "query": {
    "query_string": {
      "query": "\"Hello World\""
    }
  }
}

Zu den verschiedenen Optionen für diese Abfragen gibt es noch viel mehr zu sagen. Schauen Sie sich bitte die zugehörige Dokumentation an:

Hoffe das ist klar genug und es wird helfen.

ThomasC
quelle
Tolle, wundervolle und gründliche Erklärung! Das einzige, worüber ich unklar bin, ist, was genau eine Analyse ist oder tut ...
blee908
1
Gern geschehen :) Analysatoren verarbeiten den Text, um die Begriffe zu erhalten, die schließlich indiziert / durchsucht werden. Lesen Sie diese Seiten des ElasticSearch Definitive Guide, da dies ein wirklich wichtiges Konzept ist, das Sie verstehen sollten.
ThomasC
1
Ja, aus SQL kommen hier viele neue Ideen. Der Unterschied zwischen Abfragen und Filtern, genauen Werten gegenüber Volltext, JSON-Suchobjekt und der Art und Weise, wie die elastische Suche ihre Suche ausführt. SO VIEL ZU NEHMEN !!! Danke für die Ressource!
blee908
1
@ThomasC Wenn Sie {"foo": "Hallo schöne Welt"} in Ihrem Index hatten, wird die übereinstimmende Abfrage dies zurückgeben?
Batmaci
1
@batmaci eine matchAbfrage verwenden Sie den Analysator, wenn das Feld analysiert wird, also ja. Standardmäßig werden Dokumente mit mindestens einem der Begriffe (siehe Parameter operator) zurückgegeben, und die Reihenfolge ist nicht wichtig.
ThomasC
17

Ich denke, jemand sucht definitiv nach Unterschieden zwischen ihnen in Bezug auf PARTIAL SEARCH. Hier ist meine Analyse mit dem Standard -Standardanalysator : -

Angenommen, wir haben Daten: -

{"name": "Hallo"}

Was ist nun, wenn wir eine Teilsuche mit ell durchführen möchten?

Termabfrage ODER Übereinstimmungsabfrage

{"term":{"name": "*ell*" }

Funktioniert nicht.

{"term":{"name": "*zz* *ell*" }

Funktioniert nicht.

Schlussfolgerung - Term oder Match kann überhaupt keine Teilsuche durchführen

Platzhalterabfrage: -

{"wildcard":{"name": "*ell*" }

Funktioniert Ergebnis {"Name": "Hallo"}

{"wildcard":{"name": "*zz* *ell*" }

Funktioniert nicht.

Fazit - Wildcard kann nur mit einem Token teilweise suchen

Query_string: -

{"query_string": {"default_field": "name","query": "*ell*"}

Wird funktionieren geben Ergebnis {"Name": "Hallo"}

{"query_string": {"default_field": "name","query": "*zz* *ell*" }

Funktioniert das Ergebnis {"Name": "Hallo"}.

Fazit - query_string kann mit zwei Token suchen

-> hier sind Token ell und zz

Opster Elasticsearch Pro-Vijay
quelle
wildcard is able to do partial search with one token only: Genauer gesagt wildcardfunktionieren Abfragen standardmäßig nur für keywordFelder , die per Definition ein einzelnes Token sind. Das hat nichts damit zu tun, dass der Feldinhalt mehr als ein Wort ist. In Ihrer Platzhalterabfrage würde "ozzy hello" übereinstimmen.
Sox mit Monica