Zapytania a filtry

198

Nie widzę żadnego opisu tego, kiedy powinienem użyć zapytania, filtru lub ich kombinacji. Jaka jest różnica między nimi? Czy ktoś może wyjaśnić?

Jonesie
źródło
46
Oficjalna dokumentacja nie jest zbyt jasna
geekazoid
2
Wygląda na to, że pojawiła się strona z bardziej zaawansowanymi objaśnieniami: elastic.co/guide/en/elasticsearch/guide/master/…
Dmitry Polushkin
6
Warto zauważyć, że zapytania i filtry zostaną połączone w ES 2.0, stąd większość tego, co zostało powiedziane i napisane dla zapytań vs. filtrów, nie będzie już obowiązywać. Sprawdź także oficjalny post na blogu informujący o tej zmianie.
Val

Odpowiedzi:

201

Różnica jest prosta: filtry są buforowane i nie wpływają na wynik, dlatego są szybsze niż zapytania. Spójrz też tutaj . Powiedzmy, że zapytanie jest zwykle czymś, co użytkownicy wpisują i jest prawie nieprzewidywalne, a filtry pomagają użytkownikom zawęzić wyniki wyszukiwania, na przykład przy użyciu aspektów.

javanna
źródło
19
Tak, jeśli użytkownik wykonuje wyszukiwanie typu Google, użyłbym zapytania? Jeśli wybierają możliwą wartość z listy rozwijanej (np. Liczba faktur> 50), to byłby to filtr?
Jonesie,
4
Tak, dokładnie tak. Za każdym razem, gdy trzeba ograniczyć cały zestaw dokumentów za pomocą niektórych danych, zwykle jest to odpowiedni filtr. Więc może według wieku, długości, rozmiaru itp.
Zach.
Moje rozwiązanie wykorzystuje filtry i zapytania w tym samym żądaniu i jest super szybkie w testowej bazie danych. Wkrótce udostępnimy tam dane na żywo, aby zobaczyć, jak szybko to naprawdę jest.
Jonesie,
@Zach Aby być absolutnie jasnym, w systemie z wieloma dzierżawcami - z uprawnieniami dla użytkowników w dzierżawie - brzmi to tak, jakby informacje o dzierżawie / uwierzytelnieniu byłyby filtrem dodawanym do każdego zapytania (tj. Zapytaniem Filtrowanym). Dobrze?
Scott Willeke,
4
@activescott Tak, właśnie to bym zrobił. Możesz także skonfigurować filtrowane aliasy, aby „aliasy użytkownika” zawsze stosowały odpowiedni filtr. Ułatwia administrację i nie wymaga zmian kodu w celu aktualizacji zapytań, dodatkowego cruft w zapytaniu itp.
Zach.
99

Tak mówi oficjalna dokumentacja:

Zasadniczo zamiast zapytań należy stosować filtry:

  • dla binarnych wyszukiwań tak / nie
  • dla zapytań o dokładne wartości

Zasadniczo zamiast filtrów należy stosować zapytania:

  • do wyszukiwania pełnotekstowego
  • gdzie wynik zależy od oceny trafności
idę
źródło
kiedy chcę usunąć dokument, czy powinienem używać filtra, jeśli to możliwe? Nie chcę, żeby był buforowany
Rytek
podczas usuwania dokumentu nie jest wymagana ocena ani wyszukiwanie pełnotekstowe. Byłby to więc filtr, ponieważ wystarczy podjąć decyzję o usunięciu / nie usunięciu. filtr-kontekst-zapytanie
nonNumericalFloat
13

Przykład (spróbuj sam)

Indeks Say myindexzawiera trzy dokumenty:

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!" }'

Zapytanie: jak dobrze dokument pasuje do zapytania

Zapytanie hello sam(przy użyciu słowa kluczowego must)

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

Dokument "Hello world! I am Sam."ma wyższy wynik niż "Hello world!", ponieważ ten pierwszy pasuje do obu słów w zapytaniu. Dokumenty są punktowane.

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

Filtr: czy dokument pasuje do zapytania

Filtruj hello sam(używając słowa kluczowego filter)

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

Dokumenty, które zawierają albo helloczy samsą zwracane. Dokumenty NIE są punktowane .

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

Jeśli nie potrzebujesz wyszukiwania pełnotekstowego lub oceniania, preferowane są filtry, ponieważ często używane filtry będą buforowane automatycznie przez Elasticsearch, aby przyspieszyć działanie. Zobacz Elasticsearch: Zapytanie i kontekst filtrowania.

kgf3JfUtW
źródło
11

Jeszcze kilka dodatków do tego samego. Najpierw stosowany jest filtr, a następnie zapytanie jest przetwarzane na podstawie wyników. Aby zapisać binarne dopasowanie prawda / fałsz dla każdego dokumentu, używana jest funkcja zwana bitSet Array. Ta tablica BitSet jest w pamięci i będzie używana od drugiego zapytania o filtr. W ten sposób, korzystając ze struktury danych tablicy zestawów bitów, jesteśmy w stanie wykorzystać buforowany wynik.

Należy jeszcze wspomnieć o tym, że pamięć podręczna filtra jest tworzona tylko wtedy, gdy żądanie jest wykonywane, a więc dopiero od drugiego trafienia, faktycznie uzyskujemy przewagę buforowania.

Ale wtedy możesz użyć cieplejszego API , aby to przerastać. Po zarejestrowaniu zapytania z filtrem w cieplejszym interfejsie API upewni się, że jest ono wykonywane dla nowego segmentu za każdym razem, gdy zostanie uruchomione. Dzięki temu uzyskamy stałą prędkość od samego pierwszego wykonania.

Vineeth Mohan
źródło
1
Ciekawy! Nie zdawałem sobie sprawy, że filtry pojawiają się przed zapytaniami. Buforowanie filtrów ma teraz większy sens.
Constant Meiring
Nie zawsze. Podstawowa i podstawowa różnica między kwerendą filtrowaną a stałą. Stały wynik zawsze najpierw wykonuje zapytanie, a następnie stosuje do niego filtr. Nawet filtrowane zapytanie ma ustawienia, według których zapytanie może być wykonywane przed filtrami.
piyushGoyal
10

Zasadniczo zapytanie jest używane, gdy chcesz przeprowadzić wyszukiwanie w swoich dokumentach z punktacją. Do zawężenia zestawu wyników uzyskanych za pomocą zapytania służą filtry. Filtry są typu logicznego.

Załóżmy na przykład, że masz indeks restauracji, takich jak zomato. Teraz chcesz wyszukać restauracje serwujące „pizzę” , która jest w zasadzie słowem kluczowym wyszukiwania.

Użyjesz zapytania, aby znaleźć wszystkie dokumenty zawierające „pizzę” i uzyskać niektóre wyniki.

Powiedz teraz, że chcesz mieć listę restauracji, która serwuje pizzę i ma ocenę co najmniej 4.0.

Musisz więc użyć słowa kluczowego „pizza” w zapytaniu i zastosować filtr do oceny jako 4.0.

To, co się dzieje, polega na tym, że filtry są zwykle stosowane do wyników uzyskanych przez zapytanie twojego indeksu.

Rahul Bhanushali
źródło
Nie możesz podać przykładu treści żądania?
Pies,
9

Filters-> Czy ten dokument pasuje? binarny tak lub nie odpowiedź

Queries-> Czy ten dokument pasuje? Jak dobrze to pasuje? używa punktacji

Emmanuel Osimosu
źródło
0

Od wersji 2 Elasticsearch filtry i zapytania zostały scalone, a dowolna klauzula zapytania może być używana jako filtr lub zapytanie (w zależności od kontekstu). Podobnie jak w wersji 1, filtry są buforowane i powinny być używane, jeśli ocenianie nie ma znaczenia.

Źródło: https://logz.io/blog/elasticsearch-queries/


źródło