【问题标题】:How to count elements by cardinality in elasticsearch?如何在弹性搜索中按基数计算元素?
【发布时间】:2016-08-07 15:49:44
【问题描述】:

假设我有一个存储人的物理属性的映射,以及该映射中的一个字段,即用户 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"
            }
        }
    }
}

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

【问题讨论】:

    标签: elasticsearch elasticsearch-aggregation


    【解决方案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 提出这个问题。

    【讨论】:

    • 不会 doc_count for any key 会给出人数吗?还是我错过了什么?
    • 是的,前提是每个 user_id / eyes_color 对只有一个文档。如果他们考虑使用镜片,可以想象为每个人存储多种眼睛颜色。不太可能,但有可能。
    • 谢谢解释。
    • 这是我所问问题的正确答案,但我现在意识到我问错了。将发布一个新问题,现在可以更好地解释自己。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    相关资源
    最近更新 更多