2016-07-28 13 views
5

Jestem obecnie zmaga się z zapytaniem ElastSearch która obecnie wygląda następujące:Łącząc must_not w ElasticSearch Query

... 
"query": { 
    "bool": { 
     "must_not": [ 
      { 
       "term": { 
        "bool-facet.criteria1": { 
         "value": false 
        } 
       } 
      }, 
      { 
       "term": { 
        "bool-facet.criteria2": { 
         "value": false 
        } 
       } 
      } 
     ] 
    } 
} 
... 

Więc teraz, gdy albo criteria1 LUB criteria2 mecze, dokumenty są ignorowane. Jak powinno wyglądać zapytanie, aby zignorować tylko dokumenty spełniające kryteria1 I kryteria2?

Odpowiedz

1

Ponieważ aktualizacja wersji elasticsearch nie była możliwa, musiałem znaleźć inne rozwiązanie. To jest to, co pracował dla mnie:

"query": { 
    "bool": { 
     "must_not" : [ 
      { 
       "query": { 
        "bool": { 
         "must": [ 
          { 
           "term": { 
           "bool-facet.criteria1": false 
           } 
          }, 
          { 
           "term": { 
           "bool-facet.criteria2": false 
           } 
          } 
         ] 
        } 
       } 
      } 
     ] 
    } 
} 
+0

W wersji 5.5.1 pojawia się błąd analizy z następującego powodu: " nie [zapytanie] zarejestrowane dla [zapytanie] " – Mnebuerquo

+0

Wierzę, wewnątrz" must_not "nie ma potrzeby ponownego pisania" zapytania ". Wewnętrzna klauzula "musi" może być zapisana bezpośrednio pod "must_not". Nie jestem pewien, czy to dobra praktyka czy nie. edytuj: aahh .. jest już wspomniana w odpowiedzi poniżej. – manoj

3

Jeśli chcesz prosty AND -behavior, a potem tylko gniazdo inny bool zapytania wewnątrz niej:

"query": { 
    "bool": { 
    "must_not": [ 
     { 
     "bool": { 
      "filter": [ 
      { 
       "term": { 
       "bool-facet.criteria1": false 
       } 
      }, 
      { 
       "term": { 
       "bool-facet.criteria2": false 
       } 
      } 
      ] 
     } 
     } 
    ] 
    } 
} 

Należy pamiętać, że przy użyciu filter (jak to jest tak/nie pytanie bez potrzebnej gola, ale jeśli chciałeś zdobyć punkty, wtedy użyłbyś must zamiast filter) otrzymasz pożądane zachowanie AND. Zmienia to pytanie na "nie" (dowolny dokument, który ma kryteria1 == false AND criteria2 == false) ".

+0

Powoduje to następujący błąd dla mnie: zapytanie bool nie obsługuje [filtr] – kcm

+0

Jaką wersję masz uruchomioną? – pickypg

+0

Wydaje się być 1.4.5 ... masz na myśli to możliwe w nowszej wersji? – kcm

2

Poniższy układ pracował dla mnie na podobnym zapytaniu w 5.5.1:

"query": { 
    "bool": { 
     "must": [ 
      { 
       "bool":{ 
        "must_not":{ 
         "term":{ 
          "bool-facet.criteria1": false 
         } 
        } 
       } 
      }, 
      { 
       "bool":{ 
        "must_not":{ 
         "term":{ 
          "bool-facet.criteria2": true 
         } 
        } 
       } 
      } 
     ] 
    } 
} 

innych odpowiedzi mogą być prawidłowe dla innych wersji, ale nie pracuj dla mnie w 5.5.1.

Powiązane problemy