具有多个字段值(bank_name)的字段(userid)的Kibana聚合可视化

时间:2019-04-10 19:05:32

标签: elasticsearch kibana

所以我有一个包含两个字段userid和bank_name的索引。每次用户获得新的银行帐户时,都会插入一个userid值和用户在其中开设帐户的银行名称。我必须使用kibanaelasticsearch创建一个可视化效果(让我们说一个饼图),以显示同一家银行中拥有2个以上(或4个可以更改的)银行帐户的用户总数名称。

我尝试创建子存储桶,但这给出了两件事:第一显示根据名称的值划分的银行名称的总数,第二显示每个用户在该银行拥有一个帐户的次数。我四处搜索,认为我必须在aggs中的某个地方使用sub_doc_count,但无法弄清楚在哪里或如何使用。

例如以下数据:

[{
  "_id": 10001,
  "userid": 0,
  "bank_name": "xyz bank",
  "date": "2019-01-23"
},
 {
   "_id": 10002,
   "userid": 0,
   "bank_name": "abc bank",
   "date": "2019-01-29"
 },
 {
   "_id": 10003,
   "userid": 1,
   "bank_name": "xyz bank",
   "date": "2019-01-31"
 },
 {
   "_id": 10004,
   "userid": 2,
   "bank_name": "def bank",
   "date": "2019-02-02"
 },
 {
   "_id": 10005,
   "userid": 2,
   "bank_name": "abc bank",
   "date": "2019-02-03"
 },
 {
   "_id": 10006,
   "userid": 1,
   "bank_name": "xyz bank",
   "date": "2019-02-10"
 },
 {
   "_id": 10007,
   "userid": 1,
   "bank_name": "abc bank",
   "date": "2019-02-14"
 },
 {
   "_id": 10008,
   "userid": 0,
   "bank_name": "abc bank",
   "date": "2019-02-20"
 },
 {
   "_id": 10009,
   "userid": 0,
   "bank_name": "xyz bank",
   "date": "2019-02-20"
 }]

因此,对于以上情况,应该得到只有两个用户的饼图:0和1,其中0的计数为#2,1的计数为#1,以度量为单位。由于两个银行帐户都是唯一的或永不重复,因此不会包含用户2。

1 个答案:

答案 0 :(得分:0)

不幸的是,我不知道如何使用Kibana的本机饼形图可视化实现所需的结果-但是,要执行请求的汇总,您可以使用类似于以下内容的东西:

GET bank_users/_search
{
  "size": 0,
  "aggs": {
    "accounts_per_user": {
      "terms": {
        "field": "userid"
      },
      "aggs": {
        "accounts_per_bank": {
          "terms": {
            "field": "bank_name.keyword"
          },
          "aggs": {
            "filtered_banks": {
              "bucket_selector": {
                "buckets_path": {
                  "accounts": "_count"
                },
                "script": "params.accounts >= 2"
              }
            }
          }
        }
      }
    }
  }
}

这将从您的样本数据集中返回以下内容:

{
  "took" : 7,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 9,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "accounts_per_user" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : 0,
          "doc_count" : 4,
          "accounts_per_bank" : {
            "doc_count_error_upper_bound" : 0,
            "sum_other_doc_count" : 0,
            "buckets" : [
              {
                "key" : "abc bank",
                "doc_count" : 2
              },
              {
                "key" : "xyz bank",
                "doc_count" : 2
              }
            ]
          }
        },
        {
          "key" : 1,
          "doc_count" : 3,
          "accounts_per_bank" : {
            "doc_count_error_upper_bound" : 0,
            "sum_other_doc_count" : 0,
            "buckets" : [
              {
                "key" : "xyz bank",
                "doc_count" : 2
              }
            ]
          }
        },
        {
          "key" : 2,
          "doc_count" : 2,
          "accounts_per_bank" : {
            "doc_count_error_upper_bound" : 0,
            "sum_other_doc_count" : 0,
            "buckets" : [ ]
          }
        }
      ]
    }
  }
}

请注意,这使用的是默认的terms聚合,因此请注意局限性(即并非所有文档都可能被检索到,从而导致基数高且size参数低的大型数据集计数不正确- ref:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html)。

您也许可以利用它来创建Vega可视化。