2016-08-03 19 views
7

Mam przypadek użycia, w którym mam dane, takie jakPowrót wyjątkowe rezultaty w elasticsearch

{ 
    name: "John", 
    parentid": "1234", 
    filter: {a: '1', b: '3', c: '4'} 
}, 
{ 
    name: "Tim", 
    parentid": "2222", 
    filter: {a: '2', b: '1', c: '4'} 
}, 
{ 
    name: "Mary", 
    parentid": "1234", 
    filter: {a: '1', b: '3', c: '5'} 
}, 
{ 
    name: "Tom", 
    parentid": "2222", 
    filter: {a: '1', b: '3', c: '1'} 
} 

oczekiwanych rezultatów:

bucket:[{ 
    key: "2222", 
    hits: [{ 
     name: "Tom" ... 
    }, 
    { 
     name: "Tim" ... 
    }] 
}, 
{ 
    key: "1234", 
    hits: [{ 
     name: "John" ... 
    }, 
    { 
     name: "Mary" ... 
    }] 
}] 

chcę wrócić unikalny dokument parentid. Mimo że mogę korzystać z agregacji najwyższego poziomu, ale nie mogę tego zrobić w paginacji. Ponieważ istnieje większa szansa, że ​​parentid będzie inna niż ta sama. Tak więc tablica kubełkowa byłaby duża i chcę pokazać wszystkie, ale przez ich paginację.

+0

[Obsługa stronicowania dla agregacji] (https://github.com/elastic/elasticsearch/issues/4915) nie jest jeszcze zaimplementowana. Pokaż przykładową odpowiedź, którą chcesz uzyskać, może masz inny sposób, aby uzyskać to, czego potrzebujesz. – Val

+0

Mam zaktualizowane z oczekiwanym wynikiem, teraz moja długość wiadra będzie znacznie większa. więc jak podchodzę do tego problemu. –

+0

Wygląda na to, że agregujesz według 'parentid', a nie według" atrybutów filtru ", jak podano w twoim pytaniu. Twój cel nie jest bardzo jasny, proszę zaktualizuj swoje pytanie, aby dokładnie odzwierciedlało to, co chcesz. – Val

Odpowiedz

1

Nie ma bezpośredniego sposobu robienia tego. Ale możesz wykonać te kroki, aby uzyskać pożądany wynik.

Krok 1. Powinieneś znać wszystkie parentid. Te dane można uzyskać, wykonując proste(Czytaj więcej here) na polu parentid, a otrzymasz tylko listę parentid, a nie dokumenty do niej pasujące. Na końcu będziesz mieć mniejszą tablicę niż obecnie oczekujesz.

{ 
    "aggs": { 
    "parentids": { 
     "terms": { 
     "field": "parentid", 
     "size": 0 
     } 
    } 
    } 
} 

size: 0 jest wymagane, aby zwrócić wszystkie wyniki. Czytaj więcej here.

LUB

Jeżeli wykaz wszystkich parentid wiesz już wtedy można bezpośrednio przejść do kroku 2.

Krok 2. Fetch związanych dokumentów przez filtrowanie dokumentów według parentid i tutaj można zastosować podział na strony.

{ 
    "from": 0, 
    "size": 20, 
    "query": { 
    "filtered": { 
     "query": { 
     "match_all": {} 
     }, 
     "filter": { 
     "term": { 
      "parentid": "2222" 
     } 
     } 
    } 
    } 

} 

from i size służą do paginacji, więc można pętli każdego z parentid na liście i pobrać wszystkie związane dokumenty.

-1

Jeśli jesteś po prostu patrząc na wszystkich nazw zgrupowane według dominującego id, możesz skorzystać z poniższego zapytania:

{ 
     "query": { 
     "match_all": {} 
     },"aggs": { 
     "parent": { 
      "terms": { 
      "field": "parentid", 
      "size": 0 
      },"aggs": { 
      "NAME": { 
       "terms": { 
       "field": "name", 
       "size": 0 
       } 
      } 
      } 
     } 
     },"size": 0 
    } 

Jeśli chcesz cały dokument spis parentdId, że będzie to proces 2 krok jak wytłumaczyć Sumit powyżej i możesz tam używać stronicowania.

Agregacja nie daje dostępu do wszystkich dokumentów/dokumentów-dokumentów w wyniku ag, więc proces ten będzie musiał być dwuetapowy.

+0

Czy istnieje sposób na paginację w sub-agregacji? –

+0

@SumitKumar Zaktualizowano moją odpowiedź. Z pytania wynikało, że szukał tylko nazw dla wszystkich rodziców. Nie ma obecnie żadnego sposobu na stronicowanie wyniku agregacji. – skgemini