2015-10-01 29 views
12

iç içe geçmiş nesne değerleri eşleşti Yalnızca sorguyla eşleşen iç içe geçmiş nesnelerdeki değerleri toplamalıyım. ElasticSearch, sorguyla eşleşen belgeleri belirler ve daha sonra iç içe geçmiş nesnelerin tümünü karşılaştırır. Aşağıdaki ana hattan nestedobjects.objtype = "A" ile arama yapmak ve sadece objectedobjects ile eşleşen objvalue toplamını almak istiyorum, 4. değeri almak istiyorum. Bu mümkün mü? Öyleyse nasıl?Agrega sadece ElasticSearch

İşte haritalayan

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

olan belgelerim

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

İşte benim sorgu kodudur

olduğunu. Her iki (dış) belgelerin iç dokümanların bir eşleşen bu durum neticesinde yana

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

cevap

7

, her iki dış belgeler döndürülür ve agregasyon bu dış belgelere ait iç belgelerin tüm karşı hesaplanır. Whew.

Neyse, bu filter aggregation kullanarak, ne düşünüyorum, isteyen yaparsın görünüyor:

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

Çok iyi: Burada

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

Bunu test etmek için kullanılan bazı koddur -yapılı soru, bu arada.

+0

Teşekkürler, biraz test edeceğim. – user481779

+0

İlan edildiği şekilde çalışır! – user481779

+1

Gerçek bir çözüm yok: Filtre için önceden bilinen değerlere bağlı, histogram, date_histogram veya öngörülemeyen tuşlarla terimlerle çalışmaz. – Sebastian