Elasticsearch różnica między kwerendą typu MUST i SHOULD

169

Jaka jest różnica między zapytaniami MUSTi SHOULDbool w ES?

Jeśli chcę TYLKO wyniki zawierające moje warunki, to powinienem użyć must?

Mam zapytanie, które powinno zawierać tylko określone wartości, a także żadnych wyników, które mają niższą datę / znacznik czasu niż dzisiejsza godzina / data - TERAZ

Również

Czy mogę użyć wielu filtrów wewnątrz elementu obowiązkowego, takiego jak poniższy kod:

"filtered": {
"filter": {
"bool" : {
        "must" : {
            "term" : { "type" : 1 }
            "term" : { "totals" : 14 }
            "term" : { "groupId" : 3 }
            "range" : {
                "expires" : {
                    "gte": "now"
                }
            }
        },
user2722667
źródło

Odpowiedzi:

250

musi oznacza: klauzula (zapytanie) musi pojawić się w pasujących dokumentach. Te klauzule muszą się zgadzać, podobnie jak logiczne AND .

powinno oznaczać: co najmniej jedna z tych klauzul musi być zgodna, na przykład logiczne OR .

Zasadniczo są używane jak operatory logiczne AND i OR. Zobacz to .

Teraz w zapytaniu logicznym :

musi oznacza: klauzule, które muszą być zgodne, aby dokument został dołączony.

powinno oznaczać: Jeśli te klauzule są zgodne, zwiększają _score; w przeciwnym razie nie mają żadnego efektu. Służą one po prostu do udoskonalenia oceny trafności każdego dokumentu.


Tak, możesz użyć wielu filtrów w środku must.

Utsav Dawn
źródło
Trochę za późno na imprezę, ale co powiesz mustna kategorie, ceny i shouldatrybuty, takie jak rozmiar i kolor. Teraz, jeśli wybrano rozmiar L i XL, powinno być między tymi dwoma, ale jeśli wybrany jest również kolor zielony, musi to być pozycja obowiązkowa dla (rozmiary L LUB XL) AND (kolor zielony). Czy to jest możliwe?
Mave
Uważam, że w tym przypadku filtry mogą być lepszym podejściem do atrybutów. Są nastawione na dokładne dopasowania, a nie wyszukiwania oparte na trafności. Aby uzyskać więcej informacji, zobacz zapytania i filtry w dokumentach.
Jim K.
6
Myślę, że trzeba mieć minimum_number_should_match = 1, aby narzucić ideę, że „przynajmniej jedna z tych klauzul musi być zgodna”.
Jim K.
Dobra odpowiedź! Chcę tylko udostępnić część dokumentacji, która była dla mnie bardzo pomocna, aby to zrozumieć. elastic.co/guide/en/elasticsearch/guide/current/...
ba0708
1
JimK - lub nie klauzula obowiązkowa. Gdy nie ma klauzuli must, zakłada się minimalną liczbę_poprawną_zgodność.
LizH
15

Ponieważ jest to popularne pytanie, chciałbym dodać, że w wersji 2 Elasticsearch trochę się zmieniło.

Zamiast filteredzapytania należy używać boolzapytania na najwyższym poziomie.

Jeśli nie zależy ci na partyturze partii must, to umieść te części w filtertonacji. Brak punktacji oznacza szybsze wyszukiwanie. Ponadto Elasticsearch automatycznie ustali, czy należy je buforować itp. must_notJest równie ważne w przypadku buforowania.

Źródła: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html

Pamiętaj też, że "gte": "now"nie można buforować z powodu milisekundowej szczegółowości. Użyj dwóch zakresów w mustklauzuli: jednego z, now/1ha drugiego z, nowaby pierwszy mógł być przez chwilę buforowany, a drugi do precyzyjnego filtrowania przyspieszonego na mniejszym zestawie wyników.

TautrimasPajarskas
źródło
8

Jak wspomniano w dokumentacji :

Musi: Klauzula (zapytanie) musi pojawić się w pasujących dokumentach.

Powinno: Klauzula (zapytanie) powinna pojawić się w pasującym dokumencie. W zapytaniu boolowskim bez klauzul „must”, co najmniej jedna klauzula powinna być zgodna z dokumentem. Minimalną liczbę zgodnych klauzul powinno można ustawić za pomocą parametru minimum_should_match.

Innymi słowy, wyniki będą musiały być dopasowane przez wszystkie zapytania obecne w klauzuli must (lub dopasować co najmniej jedną z klauzul powinny , jeśli nie ma klauzuli must .

Ponieważ chcesz, aby wyniki spełniały wszystkie zapytania, powinieneś użyć funkcji must .


Rzeczywiście możesz użyć filtrów wewnątrz zapytania logicznego.

Heschoon
źródło
10
Myślę, że masz na myśli raczej „musisz użyć musi” niż „powinieneś użyć musi” ;-)
jarmod