当前位置: 首页 > 知识库问答 >
问题:

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

盖嘉庆
2023-03-14

我有一些文件存储在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
}

我想得到的是字段1、字段2或字段3对每个文档的最大次数的计数,按日期分组,即。期望结果如下:

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

我在date上使用了一个术语聚合,但不知道如何比较不同的字段,以便使用Elasticsearch聚合来执行此max and count类型的操作。有什么建议吗?

共有1个答案

宗政燕七
2023-03-14

您可以使用以下选项:

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

提示:请确保您的字段*属性映射为typedouble,而不是float,因为例如,字段1的最大agg可能会产生0.8999979761581421,而不是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"
          }
        }
      }
    }
  }
}

 类似资料:
  • 我正在尝试获取日期的最大值和最小值。 从文档中,我看不到composite中的max选项:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-composite-aggregation.html#_value_sources 我想要这样的东西: 是否可以添加到此查询中,

  • 问题内容: 如何为特定类型执行ElasticSearch聚合?我意识到您可以在请求网址中指定索引和/或类型,但是我想对两种不同的类型进行汇总。 谢谢! 问题答案: 您可以按类型过滤聚合,然后使用子聚合。例如:

  • 我是Elasticsearch的新手,我希望在Elasticsearch 5的字段上执行某些聚合。x索引。我有一个索引,其中包含带有字段(具有嵌套结构)和字段(具有嵌套结构)的文档。这些是动态映射的字段。以下是示例文档 文件2: DOC 3: 我想在langs字段上执行总和聚合,这样对于每个键(X/Y)和每种语言,我都可以获得索引中所有文档的总和。此外,我还想从docLang字段生成每种语言类型的

  • 问题内容: 我将此数据插入了Elasticsearch: 旁注:重现: 1)下载:http://wmo.co/20160928_es_query/bulk.json 2)执行:卷曲-s -XPOST ‘ 的http://本地主机:9200 /测试/外部/ _bulk漂亮 ‘ -数据二进制@ bulk.json 问题: 获取每个“位置”有多少记录的计数。 解决方案1:存储桶聚合..没有得到期望的结果

  • Elasticsearch新手问题。我上了莎士比亚的课。json转换为Elastic,我正试图找出如何进行类似于按说话人从行组中计数(1)的聚合。(“Line”是文档的类型,“speaker”是属性之一。) 现在我有一个这样的查询: 结果看起来不错,但ElasticSearch文档指定术语聚合的文档计数是近似值(https://www.elastic.co/guide/en/elasticsear

  • 问题内容: 示例文档中有一个简化的文档。这对我理解非嵌套类型与嵌套类型的聚合差异很有帮助。但是,这种简化掩盖了进一步的复杂性,因此我不得不在这里扩展这个问题。 所以我的实际文件更接近以下内容: 因此,我保留了,和的关键属性,但隐藏了许多其他使情况复杂化的内容。首先,请注意,与引用的问题相比,有很多额外的嵌套:在根和“项目”之间,以及在“项目”和“ item_property_1”之间。此外,还请注