Abfragen vs. Filter


198

Ich kann keine Beschreibung sehen, wann ich eine Abfrage oder einen Filter oder eine Kombination aus beiden verwenden sollte. Was ist der Unterschied zwischen ihnen? Kann jemand bitte erklären?


46
Offizielle Dokumentation ist in der Tat nicht sehr klar
Geekazoid

2
Es sieht so aus, als wäre eine Seite mit ausführlicheren Erklärungen erschienen: elastic.co/guide/en/elasticsearch/guide/master/…
Dmitry Polushkin

6
Es ist erwähnenswert, dass Abfragen und Filter in ES 2.0 zusammengeführt werden. Daher gilt das meiste, was für Abfragen und Filter gesagt und geschrieben wurde, nicht mehr. Überprüfen Sie auch den offiziellen Blog-Beitrag , in dem diese Änderung angekündigt wird.
Val

Antworten:


201

Der Unterschied ist einfach: Filter werden zwischengespeichert und beeinflussen die Punktzahl nicht, daher schneller als Abfragen. Schauen Sie auch hier vorbei . Angenommen, eine Abfrage wird normalerweise von den Benutzern eingegeben und ist ziemlich unvorhersehbar, während Filter den Benutzern helfen, die Suchergebnisse einzugrenzen, beispielsweise mithilfe von Facetten.


19
Richtig, wenn der Nutzer eine Google-Typensuche durchführt, würde ich eine Abfrage verwenden? Wenn sie einen möglichen Wert aus einer Dropdown-Liste auswählen (z. B. Rechnungszahl> 50), wäre dies ein Filter?
Jonesie

4
Ja, das ist genau richtig. Jedes Mal, wenn Sie den gesamten Dokumentensatz um eine bestimmte Metrik einschränken müssen, ist normalerweise ein Filter geeignet. Also vielleicht nach Alter, Länge, Größe usw. usw.
Zach

Meine Lösung verwendet Filter und Abfragen in derselben Anforderung und ist in der Testdatenbank sehr schnell. Wir werden bald die Live-Daten dort erhalten, um zu sehen, wie schnell es wirklich ist.
Jonesie

@Zach Um ganz klar zu sein, in einem System mit mehreren Mandanten - mit Berechtigungen für Benutzer innerhalb eines Mandanten - klingt es so, als wären die Mandanten- / Authentifizierungsinformationen ein Filter, der jeder Abfrage hinzugefügt wird (dh eine gefilterte Abfrage). Richtig?
Scott Willeke

4
@activescott Ja, das würde ich tun. Sie können auch gefilterte Aliase einrichten, sodass "Benutzer-Aliase" immer den entsprechenden Filter anwenden. Erleichtert die Verwaltung und erfordert keine Codeänderungen zum Aktualisieren von Abfragen, zusätzliche Cruft in Ihrer Abfrage usw.
Zach

99

Dies ist, was offizielle Dokumentation sagt:

In der Regel sollten Filter anstelle von Abfragen verwendet werden:

  • für binäre Ja / Nein-Suchen
  • für Fragen zu genauen Werten

In der Regel sollten Abfragen anstelle von Filtern verwendet werden:

  • für die Volltextsuche
  • wobei das Ergebnis von einer Relevanzbewertung abhängt

Wenn ich ein Dokument löschen möchte, sollte ich nach Möglichkeit einen Filter verwenden? Ich möchte nicht, dass es zwischengespeichert wird
Rytek

Wenn Sie ein Dokument löschen, benötigen Sie weder eine Punktzahl noch eine Volltextsuche. Dies wäre also ein Filter als, da Sie nur eine Lösch- / Nicht-Löschentscheidung treffen müssen. filter-query-context
nonNumericalFloat

13

Ein Beispiel (probieren Sie es selbst)

Angenommen, der Index myindexenthält drei Dokumente:

curl -XPOST localhost:9200/myindex/mytype  -d '{ "msg": "Hello world!" }'
curl -XPOST localhost:9200/myindex/mytype  -d '{ "msg": "Hello world! I am Sam." }'
curl -XPOST localhost:9200/myindex/mytype  -d '{ "msg": "Hi Stack Overflow!" }'

Abfrage: Wie gut ein Dokument mit der Abfrage übereinstimmt

Abfrage hello sam(mit Schlüsselwort must)

curl localhost:9200/myindex/_search?pretty  -d '
{
  "query": { "bool": { "must": { "match": { "msg": "hello sam" }}}}
}'

"Hello world! I am Sam."Dem Dokument wird eine höhere Punktzahl zugewiesen als "Hello world!", da das erstere mit beiden Wörtern in der Abfrage übereinstimmt. Dokumente werden bewertet.

"hits" : [
   ...
     "_score" : 0.74487394,
     "_source" : {
       "name" : "Hello world! I am Sam."
     }
   ...
     "_score" : 0.22108285,
     "_source" : {
       "name" : "Hello world!"
     }
   ...

Filter: Gibt an, ob ein Dokument mit der Abfrage übereinstimmt

Filter hello sam(mit Schlüsselwort filter)

curl localhost:9200/myindex/_search?pretty  -d '
{
  "query": { "bool": { "filter": { "match": { "msg": "hello sam" }}}}
}'

Dokumente, die entweder enthalten hellooder samzurückgegeben werden. Dokumente werden NICHT bewertet .

"hits" : [
   ...
     "_score" : 0.0,
     "_source" : {
       "name" : "Hello world!"
     }
   ...
     "_score" : 0.0,
     "_source" : {
       "name" : "Hello world! I am Sam."
     }
   ...

Sofern Sie keine Volltextsuche oder -bewertung benötigen, werden Filter bevorzugt, da häufig verwendete Filter von Elasticsearch automatisch zwischengespeichert werden, um die Leistung zu beschleunigen. Siehe Elasticsearch: Abfrage- und Filterkontext.


11

Wenige mehr dazu. Zuerst wird ein Filter angewendet, und dann wird die Abfrage über ihre Ergebnisse verarbeitet. Um die binäre True / False-Übereinstimmung pro Dokument zu speichern, wird ein sogenanntes BitSet-Array verwendet. Dieses BitSet-Array befindet sich im Speicher und wird ab dem zweiten Abfragen des Filters verwendet. Auf diese Weise können wir mithilfe der Bitstruktur-Array-Datenstruktur das zwischengespeicherte Ergebnis verwenden.

Ein weiterer Punkt, den Sie hier beachten sollten: Der Filter-Cache wird nur erstellt, wenn die Anforderung ausgeführt wird. Daher erhalten wir erst ab dem zweiten Treffer den Vorteil des Caching.

Aber dann können Sie eine wärmere API verwenden , um dies zu überwinden. Wenn Sie eine Abfrage mit Filter für eine wärmere API registrieren, wird sichergestellt, dass diese bei jedem Live-Start für ein neues Segment ausgeführt wird. Daher erhalten wir ab der ersten Ausführung selbst eine konstante Geschwindigkeit.


1
Interessant! Ich wusste nicht, dass Filter vor Abfragen auftreten. Das Zwischenspeichern von Filtern ist jetzt sinnvoller.
Constant Meiring

Nicht immer. Der grundlegende und primäre Unterschied zwischen gefilterter und konstanter Score-Abfrage. Konstante Punktzahl führt immer zuerst die Abfrage aus und wendet dann einen Filter darauf an. Selbst gefilterte Abfragen haben Einstellungen, mit denen Abfragen vor Filtern ausgeführt werden können.
piyushGoyal

10

Grundsätzlich wird eine Abfrage verwendet, wenn Sie eine Suche in Ihren Dokumenten mit Bewertung durchführen möchten. Und Filter werden verwendet, um die mithilfe von Abfragen erzielten Ergebnisse einzugrenzen. Filter sind boolesch.

Angenommen, Sie haben einen Index von Restaurants wie Zomato. Jetzt möchten Sie nach Restaurants suchen, die "Pizza" anbieten. Dies ist im Grunde Ihr Suchbegriff.

Sie werden also die Abfrage verwenden, um alle Dokumente zu finden, die "Pizza" enthalten, und einige Ergebnisse werden erhalten.

Angenommen, Sie möchten eine Liste von Restaurants, die Pizza servieren und eine Bewertung von mindestens 4,0 haben.

Sie müssen also das Schlüsselwort "pizza" in Ihrer Abfrage verwenden und den Filter für die Bewertung als 4.0 anwenden.

Was passiert ist, dass Filter normalerweise auf die Ergebnisse angewendet werden, die durch Abfragen Ihres Index erhalten werden.


Können Sie kein Beispiel für einen Anfragetext angeben?
Hund

9

Filters-> Stimmt dieses Dokument überein? eine binäre Ja- oder Nein- Antwort

Queries-> Stimmt dieses Dokument überein? Wie gut passt es zusammen? verwendet Scoring


0

Seit Version 2 von Elasticsearch wurden Filter und Abfragen zusammengeführt, und jede Abfrageklausel kann je nach Kontext entweder als Filter oder als Abfrage verwendet werden. Wie bei Version 1 werden Filter zwischengespeichert und sollten verwendet werden, wenn die Bewertung keine Rolle spielt.

Quelle: https://logz.io/blog/elasticsearch-queries/

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.