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?
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?
Antworten:
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.
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
Angenommen, der Index myindex
enthä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
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
hello sam
(mit Schlüsselwort filter
)curl localhost:9200/myindex/_search?pretty -d '
{
"query": { "bool": { "filter": { "match": { "msg": "hello sam" }}}}
}'
Dokumente, die entweder enthalten hello
oder sam
zurückgegeben werden. Dokumente werden NICHT bewertet .
"hits" : [
...
"_score" : 0.0,
"_source" : {
"name" : "Hello world!"
}
...
"_score" : 0.0,
"_source" : {
"name" : "Hello world! I am Sam."
}
...
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.
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.
Filters
-> Stimmt dieses Dokument überein? eine binäre Ja- oder Nein- Antwort
Queries
-> Stimmt dieses Dokument überein? Wie gut passt es zusammen? verwendet Scoring
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.