2015-10-01 10 views
12

Potrzebuję zsumować tylko wartości w zagnieżdżonych obiektach pasujących do zapytania. Wygląda na to, że ElasticSearch określa dokumenty pasujące do zapytania, a następnie sumuje wszystkie zagnieżdżone obiekty. Z poniższego konspektu chcę wyszukać na nestedobjects.objtype = "A" i odzyskać sumę objvalue tylko dla pasujących obiektów nestedobjects, chcę uzyskać wartość 4. czy jest to możliwe? Jeśli tak to jak?Zagregowane wartości dopasowane tylko do zagnieżdżonych obiektów w ElasticSearch

Oto odwzorowanie

{ 
    "myindex": { 
    "mappings": { 
     "mytype": { 
     "properties": { 
      "nestedobjects": { 
      "type": "nested", 
      "include_in_parent": true, 
      "properties": { 
       "objtype": { 
       "type": "string" 
       }, 
       "objvalue": { 
       "type": "integer" 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

Oto moje dokumenty

PUT /myindex/mytype/1 
{ 
    "nestedobjects": [ 
    { "objtype": "A", "objvalue": 1 }, 
    { "objtype": "B", "objvalue": 2 } 
    ] 
} 
PUT /myindex/mytype/2 
{ 
    "nestedobjects": [ 
    { "objtype": "A", "objvalue": 3 }, 
    { "objtype": "B", "objvalue": 3 } 
    ] 
} 

Oto mój kod zapytania.

POST allscriptshl7/_search?search_type=count 
{ 
    "query": { 
    "filtered": { 
     "query": { 
     "query_string": { 
      "query": "nestedobjects.objtype:A" 
     } 
     } 
    } 
    }, 
    "aggregations": { 
    "my_agg": { 
     "sum": { 
     "field": "nestedobjects.objvalue" 
     } 
    } 
    } 
} 

Odpowiedz

7

Ponieważ oba (zewnętrznej) dokumenty zgodne z warunkiem, że jeden z ich wewnętrznymi dokumentami dopasować zapytanie, oba dokumenty zewnętrzne są zwracane, a agregacja jest obliczana na podstawie wszystkich wewnętrznych dokumentów należących do tych zewnętrznych dokumentów. Whew.

W każdym razie, to wydaje się robić to, czego chce, myślę, używając filter aggregation:

POST /myindex/_search?search_type=count 
{ 
    "aggs": { 
     "nested_nestedobjects": { 
     "nested": { 
      "path": "nestedobjects" 
     }, 
     "aggs": { 
      "filtered_nestedobjects": { 
       "filter": { 
        "term": { 
        "nestedobjects.objtype": "a" 
        } 
       }, 
       "aggs": { 
        "my_agg": { 
        "sum": { 
         "field": "nestedobjects.objvalue" 
        } 
        } 
       } 
      } 
     } 
     } 
    } 
} 
... 
{ 
    "took": 4, 
    "timed_out": false, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 2, 
     "max_score": 0, 
     "hits": [] 
    }, 
    "aggregations": { 
     "nested_nestedobjects": { 
     "doc_count": 4, 
     "filtered_nestedobjects": { 
      "doc_count": 2, 
      "my_agg": { 
       "value": 4, 
       "value_as_string": "4.0" 
      } 
     } 
     } 
    } 
} 

Oto kod użyłem go przetestować:

http://sense.qbox.io/gist/c1494619ff1bd0394d61f3d5a16cb9dfc229113a

Bardzo dobrze - Nawiasem mówiąc, skonstruowane pytanie.

+0

Dzięki, przetestuję to nieco. – user481779

+0

Działa jak w reklamie! – user481779

+1

Brak rzeczywistego rozwiązania: zależy od wcześniej znanych wartości filtru, nie działa z histogramem, histogramem daty ani terminami z nieprzewidywalnymi klawiszami. – Sebastian

Powiązane problemy