Jaka jest różnica między zapytaniami MUST
i SHOULD
bool 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"
}
}
},
źródło
must
na kategorie, ceny ishould
atrybuty, 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?minimum_number_should_match = 1
, aby narzucić ideę, że „przynajmniej jedna z tych klauzul musi być zgodna”.Ponieważ jest to popularne pytanie, chciałbym dodać, że w wersji 2 Elasticsearch trochę się zmieniło.
Zamiast
filtered
zapytania należy używaćbool
zapytania na najwyższym poziomie.Jeśli nie zależy ci na partyturze partii
must
, to umieść te części wfilter
tonacji. Brak punktacji oznacza szybsze wyszukiwanie. Ponadto Elasticsearch automatycznie ustali, czy należy je buforować itp.must_not
Jest 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 wmust
klauzuli: jednego z,now/1h
a drugiego z,now
aby pierwszy mógł być przez chwilę buforowany, a drugi do precyzyjnego filtrowania przyspieszonego na mniejszym zestawie wyników.źródło
Jak wspomniano w dokumentacji :
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.
źródło