elasticsearch聚合和最大计数类型操作

plupiseo  于 2021-06-14  发布在  ElasticSearch
关注(0)|答案(1)|浏览(387)

我在elasticsearch中存储了一些文档,如下所示:

{
          "date" : 1,
          "field1" : 0.2,
          "field2" : 0.5,
          "field3" : 0.3
},
{
          "date" : 1,
          "field1" : 0.9,
          "field2" : 0.5,
          "field3" : 0.1
},
{
          "date" : 2,
          "field1" : 0.2,
          "field2" : 0.6,
          "field3" : 0.7
}

我想得到的是一个计数,按日期分组,field1、field2或field3中的每一个对每个文档最大的次数,即预期结果如下:

{
          "date" : 1,
          "field1-greatest" : 1,
          "field2-greatest" : 1,
          "field3-greatest" : 0
},
{
          "date" : 2,
          "field1-greatest" : 0,
          "field2-greatest" : 0,
          "field3-greatest" : 1
}

我正在使用一个日期术语聚合,但不知道如何比较不同的字段来使用elasticsearch聚合执行max和count类型的操作。有什么建议吗?

r7knjye2

r7knjye21#

您可以选择以下选项:

{
  "size": 0,
  "aggs": {
    "by_date": {
      "terms": {
        "field": "date"
      },
      "aggs": {
        "field1_greatest": {
          "max": {
            "field": "field1"
          }
        },
        "field2_greatest": {
          "max": {
            "field": "field2"
          }
        },
        "field3_greatest": {
          "max": {
            "field": "field3"
          }
        }
      }
    }
  }
}

小贴士:确保你的 field* 属性Map为类型 double ,不是 float 因为最大agg field1 例如,可以 0.8999999761581421 而不是 0.9 .
校正
这是一个非常重要的用例,所以您可能需要使用脚本。这里有一些东西可以让你开始:

{
  "size": 0,
  "aggs": {
    "by_date": {
      "terms": {
        "field": "date"
      },
      "aggs": {
        "by_greatest": {
          "scripted_metric": {
            "init_script": """
              state.field1_greatest = 0;
              state.field2_greatest = 0;
              state.field3_greatest = 0;
            """,
            "map_script": """
              def v1 = doc['field1'].value;
              def v2 = doc['field2'].value;
              def v3 = doc['field3'].value;

              // your comparison logic
            """,
            "combine_script": "state",
            "reduce_script": "states"
          }
        }
      }
    }
  }
}

相关问题