Obecnie próbuję przeprowadzić migrację aplikacji opartej na SOLR do Elasticsearch.
Mam to zapytanie lucene
((
name:(+foo +bar)
OR info:(+foo +bar)
)) AND state:(1) AND (has_image:(0) OR has_image:(1)^100)
O ile rozumiem, jest to kombinacja klauzul MUST połączonych z logiczną OR:
„Pobierz wszystkie dokumenty zawierające (foo AND bar w nazwie) OR (foo AND bar w info). Następnie filtruj wyniki według stanu warunku = 1 i popraw dokumenty, które mają obraz.”
Próbowałem użyć zapytania bool z MUST, ale nie udało mi się uzyskać logicznych klauzul OR w klauzulach must. Oto co mam:
GET /test/object/_search
{
"from": 0,
"size": 20,
"sort": {
"_score": "desc"
},
"query": {
"bool": {
"must": [
{
"match": {
"name": "foo"
}
},
{
"match": {
"name": "bar"
}
}
],
"must_not": [],
"should": [
{
"match": {
"has_image": {
"query": 1,
"boost": 100
}
}
}
]
}
}
}
Jak widać, MUSI brakować warunków dla „informacji”.
Czy ktoś ma rozwiązanie?
Dziękuję bardzo.
** AKTUALIZACJA **
Zaktualizowałem zapytanie elastyczne i pozbyłem się wyniku funkcji. Mój podstawowy problem nadal istnieje.
elasticsearch
Jesse
źródło
źródło
Odpowiedzi:
Przykład:
Chcesz zobaczyć wszystkie elementy, które są (okrągłe ORAZ (czerwony LUB niebieski)):
Możesz także wykonać bardziej złożone wersje OR, na przykład jeśli chcesz dopasować co najmniej 3 z 5, możesz określić 5 opcji w „powinno” i ustawić „minimum_should” na 3.
Dziękuję Glenowi Thompsonowi i Sebastialonso za odkrycie, gdzie wcześniej moje zagnieżdżenie nie było takie dobre.
Dziękuję również Fatmajkowi za wskazanie, że „termin” staje się „dopasowaniem” w ElasticSearch 6.
źródło
should
na wyższy poziombool
i włączenieminimum_should_match: 1
pracy?[term] malformed query, expected [END_OBJECT] but found [FIELD_NAME]
. Czy to w jakiś sposób zależy od wersji?minimum_should
jest 1, a zawijaniebool
powoduje, że ta grupa jest prawdziwa, jeśli co najmniej jeden element pasuje, lub fałsz, jeśli żaden nie pasuje. Moją motywacją do stworzenia tej odpowiedzi było to, że rozwiązałem dokładnie tego rodzaju problem, a dostępna dokumentacja, a nawet odpowiedzi, które mogłem znaleźć na takich stronach, były w najlepszym razie nieprzydatne, więc szukałem dalej, dopóki nie poczułem, że mam dość solidną wiedzę tego, co się działo. Z radością przyjmuję wszelkie konstruktywne wskazówki, w jaki sposób mogę ulepszyć odpowiedź.W końcu udało mi się stworzyć zapytanie, które robi dokładnie to, co chciałem:
Filtrowane zagnieżdżone zapytanie logiczne. Nie jestem pewien, dlaczego nie jest to udokumentowane. Może ktoś tutaj może mi powiedzieć?
Oto zapytanie:
W pseudo-SQL:
Należy pamiętać, że to, jak nazwa = foo jest wewnętrznie obsługiwana, zależy od analizy pól dokumentu i mapowań. Może się to różnić od rozmytego do ścisłego zachowania.
„minimum_should_match”: 1 mówi, że przynajmniej jedna z instrukcji powinna być prawdziwa.
To stwierdzenie oznacza, że ilekroć w zestawie wyników znajduje się dokument, który zawiera has_image: 1, jest on zwiększany o współczynnik 100. To zmienia kolejność wyników.
Bawcie się dobrze :)
źródło
W ten sposób możesz zagnieżdżać wiele zapytań bool w jednym zewnętrznym zapytaniu bool za pomocą Kibana,
W ten sposób można zagnieździć zapytanie w ES
W „bool” jest więcej typów, na przykład -
Filtr
nie możesz
źródło
Niedawno też musiałem rozwiązać ten problem i po wielu próbach i błędach wymyśliłem to (w PHP, ale mapuje bezpośrednio na DSL):
Który mapuje na coś takiego w SQL:
Kluczem w tym wszystkim jest
minimum_should_match
ustawienie. Bez tegofilter
całkowicie zastępujeshould
.Mam nadzieję, że to komuś pomoże!
źródło
W
must
musisz dodać tablicę warunków zapytania, z którą chcesz pracować,AND
aw niejshould
musisz dodać warunek zapytania, z którym chcesz pracowaćOR
.Możesz to sprawdzić: https://github.com/Smile-SA/elasticsuite/issues/972
źródło
Jeśli używasz domyślnego parsera zapytań Solr lub Lucene, prawie zawsze możesz umieścić go w zapytaniu w postaci ciągu zapytania:
To powiedziawszy, możesz chcieć użyć zapytania logicznego , takiego jak to, które już opublikowałeś, lub nawet kombinacji tych dwóch.
źródło