elasticsearch,Search,elasticsearch" /> elasticsearch,Search,elasticsearch" />

Elasticsearch:为每个唯一id筛选第一个文档

Elasticsearch:为每个唯一id筛选第一个文档,search,elasticsearch,Search,elasticsearch,我正在为以下场景编写一个elasticsearch查询: - field1 field2 - 2015 20 - 2015 14 - 2014 39 - 2013 76 - 2013 2 - 2013 55 我想为每个唯一的field1查找field2的总和,以便field2是field1的最大值。 例如,在这种情况下,我需要值=20+39+76 返回此值的elasticsearch查询是什么?我认为在elasticsearch

我正在为以下场景编写一个
elasticsearch
查询:

- field1    field2
- 2015      20
- 2015      14
- 2014      39
- 2013      76
- 2013      2
- 2013      55
我想为每个唯一的
field1
查找
field2
的总和,以便
field2
field1
的最大值。 例如,在这种情况下,我需要
值=20+39+76


返回此值的
elasticsearch
查询是什么?

我认为在elasticsearch 1.x上,单次查询是不可能的。 在2.0中,我们可能会有一个类似于减缩器的特性(请参阅:)

您可以获得任务的第一部分(按字段1分组的字段2的最大值),如下所示:

DELETE /test_index

PUT /test_index
{
    "settings": {
        "number_of_shards": 1
    }
}

POST /test_index/_bulk
{"index":{"_index":"test_index","_type":"doc","_id":1}}
{"field1":2015,"field2":20}
{"index":{"_index":"test_index","_type":"doc","_id":2}}
{"field1":2015,"field2":14}
{"index":{"_index":"test_index","_type":"doc","_id":3}}
{"field1":2014,"field2":39}
{"index":{"_index":"test_index","_type":"doc","_id":4}}
{"field1":2013,"field2":76}
{"index":{"_index":"test_index","_type":"doc","_id":5}}
{"field1":2013,"field2":2}
{"index":{"_index":"test_index","_type":"doc","_id":6}}
{"field1":2013,"field2":55}

POST /test_index/_search
{
  "size": 0,
  "aggs": {
    "field1_group": {
      "terms": {
        "field": "field1",
        "size": 0,
        "order": {
          "maksior": "asc"
        }
      },
      "aggs": {
        "maksior": {
          "max": {
            "field": "field2"
          }
        }
      }
    }
  }
}
这将给你:

{
   "took": 1,
   "timed_out": false,
   "_shards": {
      "total": 1,
      "successful": 1,
      "failed": 0
   },
   "hits": {
      "total": 6,
      "max_score": 0,
      "hits": []
   },
   "aggregations": {
      "field1_group": {
         "doc_count_error_upper_bound": 0,
         "sum_other_doc_count": 0,
         "buckets": [
            {
               "key": 2015,
               "doc_count": 2,
               "maksior": {
                  "value": 20
               }
            },
            {
               "key": 2014,
               "doc_count": 1,
               "maksior": {
                  "value": 39
               }
            },
            {
               "key": 2013,
               "doc_count": 3,
               "maksior": {
                  "value": 76
               }
            }
         ]
      }
   }
}

然后,您可以在客户端对结果进行迭代并求和。

您可以发布代码并说明失败的地方吗?我对elasticsearch不太熟悉,不知道如何编写elasticsearch查询来解决此问题。实际上,对于1.4,您可以尝试脚本度量聚合,感谢gruby的响应。我得到了类似的查询,但每个字段1的字段2的数量很大,所以不想在应用程序端求和。我使用的是ES 1.4.2,所以我可以尝试使用脚本聚合,但链接不起作用。@asurana2使用建议的查询,您可以得到与field1的不同值一样多的结果(无论有多少field2),因此我不理解这里的问题。你能解释一下吗?