2015-10-01 20 views
12

Tôi chỉ cần tính tổng giá trị trên các đối tượng lồng nhau khớp với truy vấn. Có vẻ như ElasticSearch xác định các tài liệu khớp với truy vấn và sau đó tính tổng trên tất cả các đối tượng lồng nhau. Từ phác thảo dưới đây tôi muốn tìm kiếm trên nestedobjects.objtype = "A" và lấy lại tổng của objvalue chỉ cho phù hợp với nestedobjects, tôi muốn nhận được giá trị 4. là điều này có thể? Nếu vậy, làm thế nào?Tổng hợp chỉ khớp các giá trị đối tượng lồng nhau trong ElasticSearch

Dưới đây là các bản đồ

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

Dưới đây là tài liệu của tôi

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

Đây là mã truy vấn của tôi.

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

Trả lời

7

Kể từ khi cả hai (bên ngoài) tài liệu phù hợp với điều kiện là một trong những tài liệu bên trong của họ phù hợp với truy vấn, cả hai tài liệu bên ngoài được trả về, và tập hợp được tính chống lại tất cả các tài liệu bên trong thuộc những tài liệu bên ngoài. Whew.

Dù sao, điều này dường như để làm những gì bạn đang mong muốn, tôi nghĩ rằng, sử dụng 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" 
      } 
     } 
     } 
    } 
} 

Dưới đây là một số mã tôi sử dụng để kiểm tra nó:

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

Rất tốt câu hỏi có cấu trúc, nhân tiện.

+0

Cảm ơn, tôi sẽ thử nghiệm nó một chút. – user481779

+0

Hoạt động như được quảng cáo! – user481779

+1

Không có giải pháp thực: Phụ thuộc vào các giá trị đã biết trước cho bộ lọc, không hoạt động với biểu đồ, date_histogram hoặc các cụm từ có khóa không thể đoán trước. – Sebastian

Các vấn đề liên quan