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ć?
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ć?
Odpowiedzi:
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.
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
Indeks Say myindex
zawiera 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
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
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 hello
czy sam
są zwracane. Dokumenty NIE są punktowane .
"hits" : [
...
"_score" : 0.0,
"_source" : {
"name" : "Hello world!"
}
...
"_score" : 0.0,
"_source" : {
"name" : "Hello world! I am Sam."
}
...
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.
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.
Filters
-> Czy ten dokument pasuje? binarny tak lub nie odpowiedź
Queries
-> Czy ten dokument pasuje? Jak dobrze to pasuje? używa punktacji
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.