5

mający strukturę rodzic-dzieci w Elasticsearch reprezentujący order z order_revision dzieci chcę, aby wygenerować histogram price wykazujące sumę quantity.Elasticsearch Aggregation: Suma najnowszych Dzieciak za rodzica

{ 
    "_type": "order", 
    "_id": "1063220887", 
    "_score": 1, 
    "_source": { 
    "order_id": "1063220887", 
    "product_id": "10446350", 
    "timestamp": 1462713302000 
    } 
} 

{ 
    "_type": "order_revision", 
    "_id": "10234234", 
    "_parent": "1063220887", 
    "_source": { 
    "price": 9, 
    "quantity": 3, 
    "revision": 361, 
    "timestamp": 1462712196000 
    } 
} 

Poniższa agregacja zasadniczo działa, ale zwraca sumę wszystkich istniejących wersji.

{ 
    "aggs": { 
     "orders": { 
     "filter": { 
      "has_parent": { 
      "parent_type": "order" 
      } 
     }, 
     "aggs": { 
      "quantity_per_price": { 
      "histogram": { 
       "field": "price", 
       "interval": 1 
      } 
      "aggs": { 
       "sum": {"field": quantity"} 
      } 
      } 
     } 
     } 
    } 
    } 

W ostatecznej wersji powinien zwrócić tylko sumę pól quantity dla najnowszej rewizji (z najwyższa/Najnowszy timestamp) od każdego zamówienia. Nie jestem do końca pewien, jak wymyślić taką agregację, która grupuje według order_id i wybiera tylko najnowsze dziecko, nie jestem też pewien, czy ta struktura rodzic-dziecko najlepiej modeluje te dane.

+0

Ile wersji masz mniej więcej w jednym zamówieniu? Czy mówimy w rozmiarze 1-2 lub więcej jak 10-20 +? – Val

+0

Byłoby około 10 ... –

Odpowiedz

0

Najprostszą implementacją byłoby oznaczenie ostatniej wersji ("latest": true) w dokumencie. Następnie staje się prostym problemem dodania zapytania lub agregacji filter w celu filtrowania tylko najnowszych wersji.

+0

Należy jednak pamiętać, że gdy pojawia się nowa wersja, należy również pamiętać o zaktualizowaniu ostatniej najnowszej wersji do '" latest ": false'. – Val

+0

Dzięki za powtórkę ... Nie wspomniałem w pytaniu, że oznaczenie najnowszego nie jest realną opcją, a ponadto będę musiał rozszerzyć tę funkcjonalność, aby móc cofnąć się w czasie ... Ale jak nie sądzę jest naprawdę możliwe dzięki ES, więc zaakceptowałbym twoją odpowiedź, gdyby nic innego nie przychodziło ... –