2015-10-01 1 views
12

Ich muss nur die Werte für die verschachtelten Objekte zusammenfassen, die der Abfrage entsprechen. Es sieht so aus, als ob ElasticSearch die Dokumente ermittelt, die mit der Abfrage übereinstimmen, und anschließend alle verschachtelten Objekte summiert. Aus der folgenden Gliederung möchte ich nach nestedobjects.objtype = "A" suchen und die Summe von objvalue nur für passende verschachtelte Objekte zurückholen, ich möchte den Wert 4 erhalten. Ist das möglich? Wenn das so ist, wie?Aggregieren Sie nur verschachtelte verschachtelte Objektwerte in ElasticSearch

Hier ist die Abbildung

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

Hier sind meine Dokumente

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 } 
    ] 
} 

Hier ist meine Abfrage-Code.

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

Antwort

7

Da beide (äußere) Dokumente, die die Bedingung erfüllen, dass einer ihrer Innenlagen der Abfrage entsprechen, wobei beide Außenlagen zurückgeführt werden, und die Aggregation wird berechnet gegen alle inneren Dokumente zu diesen äußeren Dokumenten gehören. Wütend.

Wie auch immer, scheint dies zu tun, was Sie wollen, glaube ich, mit 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" 
      } 
     } 
     } 
    } 
} 

Hier einige Code, die ich verwendet, um es zu testen:

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

Sehr gut -strukturierte Frage, nebenbei bemerkt.

+0

Danke, ich werde es ein wenig testen. – user481779

+0

Funktioniert wie beschrieben! – user481779

+1

Keine echte Lösung: Hängt von bekannten Werten für den Filter ab, funktioniert nicht mit Histogramm, Datumshistogramm oder Termen mit nicht vorhersagbaren Schlüsseln. – Sebastian

Verwandte Themen