在Elasticsearch中对多个字段进行术语聚合

4

我想从Elasticsearch获取一些统计数据。我有一个查询:

GET index/_search
{
  "aggs": {
    "first-metadata": {
      "terms": {
        "field": "filters.metadata.first-metadata"
      }
    }
  }
}

作为响应,我得到了这样的东西:

"aggregations": {
  "first-metadata": {
    "buckets": [
      {
        "key": 87000,
        "doc_count": 2
      },
      {
        "key": 100000,
        "doc_count": 1
      }
    ]
  }
}

一切都如我所预期的一样。但问题在于我有多个元数据类型:first-metadatasecond-metadatathird-metadata,我希望像这样:

"aggregations": {
  "first-metadata": {
    "buckets": [
      {
        "key": 87000,
        "doc_count": 2
      },
      {
        "key": 100000,
        "doc_count": 1
      }
    ]
  },
  "second-metadata": {
    "buckets": [
      {
        "key": 5555,
        "doc_count": 24
      },
      {
        "key": 2222,
        "doc_count": 14
      },
      {
        "key": 3333,
        "doc_count": 7
      }
    ]
  },
  "third-metadata": {
    "buckets": [
      {
        "key": 7777,
        "doc_count": 23
      },
      {
        "key": 3333,
        "doc_count": 11
      }
    ]
  }
}

有没有办法在一个聚合查询中实现这样的结果?
1个回答

5

这非常简单

POST index/_search
{
  "aggs": {
    "first-metadata": {
      "terms": {
        "field": "filters.metadata.first-metadata"
      }
    },
    "second-metadata": {
      "terms": {
        "field": "filters.metadata.second-metadata"
      }
    }

  }
}

确实,这很简单 :) 谢谢。但我有一个更困难的情况。如果有成千上万个元数据怎么办?我需要为每个字段重复这个过程数千次吗?或者另一种情况:元数据名称是自动生成的,我想获取所有元数据的术语聚合。我可以使用通配符(filters.metadata.*)或其他方式来完成吗? - Piotr Pradzynski
可以实现。在这里使用map-reduce实现来检查我的答案:https://stackoverflow.com/questions/48413369/can-elasticsearch-aggregations-do-what-sql-can-do/48673991#48673991 它会给你一个想法,你可以做什么。如果需要更多细节或有任何问题,请随时询问。 - pkhlop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接