如何在elasticsearch中按基数计算元素?

时间:2016-02-12 09:12:51

标签: elasticsearch elasticsearch-aggregation

假设我有一个存储人物理属性的映射,以及该映射中作为用户ID的字段。例如:

    "attributes": {
      "hair_color": {
        "type": "string"
      },
      "eyes_color": {
        "type": "string"
      },
      "height": {
        "type": "float"
      },
      "user_id": {
        "type": "integer"
      }
    }

我正在尝试进行查询,以便返回有多少人拥有给定的眼睛颜色。例如,它会返回类似" green":962的内容。

我认为我需要做的是eye_color字段的术语桶,然后是考虑user_id的基数子聚合,但到目前为止我还没有成功。这就是我所拥有的:

{
"aggs" : {
    "eyes_color_bucket" : {
        "terms" : {
            "field" : "eyes_color"
        }
    },
    "aggs":{
        "count":{
            "cardinality":{
                "field": "eyes_color_bucket"
            }
        }
    }
}

当然失败了。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

你快到了,试试这样:

{
  "size": 0,
  "aggs": {
    "eyes_color_bucket": {
      "terms": {
        "field": "eyes_color"
      },
      "aggs": {
        "count": {
          "cardinality": {
            "field": "user_id"
          }
        }
      }
    }
  }
}

<强>更新

继续下面的Richa评论,如果您假设一个用户只有一种眼睛颜色(即没有镜片或其他),您可以像这样简化聚合查询:

{
  "size": 0,
  "aggs": {
    "eyes_color_bucket": {
      "terms": {
        "field": "eyes_color"
      }
    }
  }
}

每个桶中的doc_count应该是具有该眼睛颜色的用户数量。感谢@Richa提出这个问题。