2015-03-05 16 views
8

Załóżmy, że mam indeksu z zagnieżdżonego dokumentu, który wygląda tak:Jak mogę agregować przefiltrowane zagnieżdżone dokumenty w ElasticSearch?

{ 
    "id" : 1234 
    "cars" : [{ 
      "id" : 987 
      "name" : "Volkswagen" 
     }, { 
      "id": 988 
      "name" : "Tesla" 
     } 
    ] 
} 

I teraz chcą uzyskać agregację zliczania „samochód” dokumentów pasujących do określonych kryteriów, na przykład pasujące do zapytania wyszukiwania. Moją pierwszą próbą było następujące zapytanie:

{ 
    "query" : { 
    "nested" : { 
     "path" : "cars", 
     "query" : { 
     "query_string" : { 
      "fields" : ["cars.name"], 
      "query" : "Tes*" 
     } 
     } 
    } 
    }, 
    "aggregations" : { 
    "cars" :{ 
     "nested" : { 
     "path" : "cars" 
     }, 
     "aggs" : { 
     "cars" : { 
      "terms" : { 
      "field" : "cars.id" 
      } 
     } 
     } 
    } 
    } 
} 

Miałem nadzieję tutaj, aby uzyskać wynik agregacji tylko identyfikatory samochodów, których nazwy zaczynają się od „Tes”. Jednak agregacja zamiast tego używa wszystkich samochodów, które znajdują się w dokumencie najwyższego poziomu, który zawiera również pasujące dokumenty zagnieżdżone. Oznacza to, że w powyższym przykładzie "Volkswagen" również byłby policzony, ponieważ dokument najwyższego poziomu zawiera również samochód, który pasuje.

Jak mogę uzyskać agregację tylko pasujące zagnieżdżone dokumentów?

Odpowiedz

9

W tym czasie ja zorientowaliśmy się: to osiągnąć agregacji filtr powinien być dodany wokół się wyrazy agregacji tak:

"aggregations" : { 
    "cars" :{ 
     "nested" : { 
     "path" : "cars" 
     }, 
     "aggs" : { 
     "cars-filter" : { 
      "filter" : { 
      "query" : { 
       "query_string" : { 
       "fields" : ["cars.name"], 
       "query" : "Tes*" 
       } 
      } 
      }, 
      "aggs" : { 
      "cars" : { 
       "terms" : { 
       "field" : "cars.id" 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
+0

Czy jesteś pewien, że ten kod działa? Jestem w obliczu tego samego problemu, ale gdy próbuję kodu otrzymuję 'parsing_exception'„nie [zapytanie] zarejestrowany dla zapytania []” –

+0

To na pewno nie działa, gdy stworzyłem tej kwerendy, ale format zapytań ES hasn” t zawsze był kompatybilny wstecz. IIRC Napisałem to zapytanie dla ES1.x, nowsze wersje mogą go nie zaakceptować. – Tiddo

+0

Tak, @Tiddo - otrzymuję taką samą odpowiedź jak ty. Nie mogę zobaczyć, jak to zrobić dla bieżącej wersji. Daj mi znać, jeśli masz gdziekolwiek z tym. – danieljames

Powiązane problemy