弹性搜索聚合存储桶,按记录数量存储的桶

时间:2017-08-31 02:14:16

标签: elasticsearch

我是Elastic Search的新手,我正在尝试创建一个没有太多成功的请求。以下是用例:

我们假设我有4个文档,其中有amount字段:

[
  {
    "id": 541436748332,
    "amount": 5,
    "date": "2017-01-01"
  },
  {
    "id": 6348643512,
    "amount": 2,
    "date": "2017-03-13"
  },
  {
    "id": 343687432,
    "amount": 2,
    "date": "2017-03-14"
  },
  {
    "id": 6457866181,
    "amount": 7,
    "date": "2017-05-21"
  }
]

以下是我想得到的结果:

{
  "aggregations": {
    "my_aggregation": {
      "buckets": [
        {
          "doc_count": 2,
          "sum": 7
        },
        {
          "doc_count": 2,
          "sum": 9
        }
      ]
    }
  }
}

正如你所看到的,我想要某种直方图,但我想设置一个“文档”间隔,而不是设置日期间隔。所以在这里,每个桶将有2个文档,以及这两个文档的字段amount的总和。

有人知道这是否可能?这也意味着按日期对记录进行排序,例如,获得想要的结果

编辑:关于用例的更多解释:

真实用例是我想要打印的折线图。但是我想让X轴成为销售数量,而在Y中则是这些销售额的总数$$$。而且我不想在我的图表上打印数千个点,我想要更少的点,这就是为什么我希望处理桶和总和...... 我给出的响应示例只是我想要实现的第一步,第二步是将每个字段添加到其后面的那一个:

{
  "aggregations": {
    "my_aggregation": {
      "buckets": [
        {
          "doc_count": 2,
          "sum": 7
        },
        {
          "doc_count": 2,
          "sum": 16
        }
      ]
    }
  }
}

(7 = 5 + 2); (16 = 7(从上次结果)+ 2 + 7);

1 个答案:

答案 0 :(得分:0)

您可以使用histogramsum聚合,如下所示:

{
  "size": 0,
  "aggs": {
    "prices": {
      "histogram": {
        "field": "id",
        "interval": 2,
        "offset": 1
      },
      "aggs": {
        "total_amount": {
          "sum": {
            "field": "amount"
          }
        }
      }
    }
  }
}

(如果你想让第一个桶从1开始而不是0开始,则需要offset 1.)然后你会得到这样的响应:

{
  "aggregations": {
    "prices": {
      "buckets": [
        {
          "key": 1,
          "doc_count": 2,
          "total_amount": {
            "value": 7
          }
        },
        {
          "key": 3,
          "doc_count": 2,
          "total_amount": {
            "value": 9
          }
        }
      ]
    }
  }
}

不需要排序,因为默认顺序是您想要的顺序。但是,如果您想要对存储桶进行不同的排序,还会有order参数。