聚合仅匹配ElasticSearch中的嵌套对象值

时间:2015-10-01 18:56:50

标签: elasticsearch

我只需要对与查询匹配的嵌套对象的值求和。看起来ElasticSearch确定与查询匹配的文档,然后对所有嵌套对象求和。从下面的大纲我想搜索nestedobjects.objtype =" A"并获取objvalue的总和仅用于匹配嵌套对象,我想得到值4.这可能吗?如果是这样,怎么样?

这是映射

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

以下是我的文件

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

这是我的查询代码。

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

1 个答案:

答案 0 :(得分:8)

由于两个(外部)文档都匹配其内部文档之一与查询匹配的条件,因此返回两个外部文档,并针对属于这些外部文档的所有内部文档计算聚合。呼。

无论如何,我认为,使用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"
            }
         }
      }
   }
}

以下是我用来测试它的一些代码:

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

顺便说一句,这是一个结构良好的问题。