elasticsearch - Kibana 垂直条形图在 X 轴的哪个位置我有值总和的桶?

标签 elasticsearch histogram kibana aggregation vega

假设我有以下数据:

{"name": "John", "spend": 50 }
{"name": "John", "spend": 150 }
{"name": "Mary", "spend": 30 }
{"name": "Mary", "spend": 70 }
{"name": "Will", "spend": 10 }
{"name": "Will", "spend": 20 }
{"name": "Matt", "spend": 0 }

我想构建一个垂直条形图,在 X 轴上我有每个名称支出总和的存储桶,在 Y 轴上,存储桶中名称的唯一计数,如下所示:

vertical bars

我不知道如何使用 Kibana 7.5 实现这一点。有谁能帮帮我吗?

最佳答案

一段时间后,我使用 Vega 解决了这个问题。由于我已经在 Elasticsearch 中拥有数据,因此我使用聚合按照我需要的方式使用以下请求格式化数据:

POST /teste/_search?size=0
{
    "aggs" : {
      "spend_per_name_0_to_50" : {
        "terms" : { "field" : "name" },
        "aggs" : { 
          "spend_sum" : { "sum" : { "field" : "spend" } },
          "ranges": {
            "bucket_selector": {
              "buckets_path": { "spendSum": "spend_sum.value" },
              "script": "params.spendSum < 50"
            }
          }
        }
      },
      "spend_per_name_50_to_100" : {
        "terms" : { "field" : "name" },
        "aggs" : { 
          "spend_sum" : { "sum" : { "field" : "spend" } },
          "ranges": {
            "bucket_selector": {
              "buckets_path": { "spendSum": "spend_sum.value" },
              "script": "params.spendSum >= 50 &&  params.spendSum < 100"
            }
          }
        }
      },
      "spend_per_name_100_to_150" : {
        "terms" : { "field" : "name" },
        "aggs" : { 
          "spend_sum" : { "sum" : { "field" : "spend" } },
          "ranges": {
          "bucket_selector": {
            "buckets_path": { "spendSum": "spend_sum.value" },
            "script": "params.spendSum >= 100 &&  params.spendSum < 150"
          }
        }
      }
    },
      "spend_per_name_150_to_inf" : {
        "terms" : { "field" : "name" },
        "aggs" : { 
          "spend_sum" : { "sum" : { "field" : "spend" } },
          "ranges": {
          "bucket_selector": {
            "buckets_path": { "spendSum": "spend_sum.value" },
            "script": "params.spendSum >= 150"
          }
        }
      }
    },
    "spend_sum_per_name_0_to_50": {
        "sum_bucket": {
            "buckets_path": "spend_per_name_0_to_50>spend_sum.value" 
        }
    },
    "spend_sum_per_name_50_to_100": {
        "sum_bucket": {
            "buckets_path": "spend_per_name_50_to_100>spend_sum.value" 
        }
    },
    "spend_sum_per_name_100_to_150": {
        "sum_bucket": {
            "buckets_path": "spend_per_name_100_to_150>spend_sum.value" 
        }
    },
    "spend_sum_per_name_150_to_inf": {
        "sum_bucket": {
            "buckets_path": "spend_per_name_150_to_inf>spend_sum.value" 
        }
    }
  }
}

这给了我以下数据:

{
  "took" : 6,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 7,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "spend_per_name_150_to_inf" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "John",
          "doc_count" : 2,
          "spend_sum" : {
            "value" : 200.0
          }
        }
      ]
    },
    "spend_per_name_0_to_50" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "Will",
          "doc_count" : 2,
          "spend_sum" : {
            "value" : 30.0
          }
        },
        {
          "key" : "Matt",
          "doc_count" : 1,
          "spend_sum" : {
            "value" : 0.0
          }
        }
      ]
    },
    "spend_per_name_50_to_100" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [ ]
    },
    "spend_per_name_100_to_150" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "Mary",
          "doc_count" : 2,
          "spend_sum" : {
            "value" : 100.0
          }
        }
      ]
    },
    "spend_sum_per_name_0_to_50" : {
      "value" : 30.0
    },
    "spend_sum_per_name_50_to_100" : {
      "value" : 0.0
    },
    "spend_sum_per_name_100_to_150" : {
      "value" : 100.0
    },
    "spend_sum_per_name_150_to_inf" : {
      "value" : 200.0
    }
  }
}

然后,使用此 Vega 请求发送此请求并格式化数据:

{
  "$schema": "https://vega.github.io/schema/vega/v3.json",
  "data": [
    {
      "name": "spends",
      "url": {
        "%context%": true,
        "index": "teste",
        "body": {
          "aggs" : {
            "spend_per_name_0_to_50" : {
              "terms" : { "field" : "name" },
              "aggs" : { 
                "spend_sum" : { "sum" : { "field" : "spend" } },
                "ranges": {
                  "bucket_selector": {
                    "buckets_path": { "spendSum": "spend_sum.value" },
                    "script": "params.spendSum < 50"
                  }
                }
              }
            },
            "spend_per_name_50_to_100" : {
              "terms" : { "field" : "name" },
              "aggs" : { 
                "spend_sum" : { "sum" : { "field" : "spend" } },
                "ranges": {
                  "bucket_selector": {
                    "buckets_path": { "spendSum": "spend_sum.value" },
                    "script": "params.spendSum >= 50 &&  params.spendSum < 100"
                  }
                }
              }
            },
            "spend_per_name_100_to_150" : {
              "terms" : { "field" : "name" },
              "aggs" : { 
                "spend_sum" : { "sum" : { "field" : "spend" } },
                "ranges": {
                "bucket_selector": {
                  "buckets_path": { "spendSum": "spend_sum.value" },
                  "script": "params.spendSum >= 100 &&  params.spendSum < 150"
                }
              }
            }
          },
            "spend_per_name_150_to_inf" : {
              "terms" : { "field" : "name" },
              "aggs" : { 
                "spend_sum" : { "sum" : { "field" : "spend" } },
                "ranges": {
                "bucket_selector": {
                  "buckets_path": { "spendSum": "spend_sum.value" },
                  "script": "params.spendSum >= 150"
                }
              }
            }
          },
          "spend_sum_per_name_0_to_50": {
              "sum_bucket": {
                  "buckets_path": "spend_per_name_0_to_50>spend_sum.value" 
              }
          },
          "spend_sum_per_name_50_to_100": {
              "sum_bucket": {
                  "buckets_path": "spend_per_name_50_to_100>spend_sum.value" 
              }
          },
          "spend_sum_per_name_100_to_150": {
              "sum_bucket": {
                  "buckets_path": "spend_per_name_100_to_150>spend_sum.value" 
              }
          },
          "spend_sum_per_name_150_to_inf": {
              "sum_bucket": {
                  "buckets_path": "spend_per_name_150_to_inf>spend_sum.value" 
              }
          }
        },
          "size": 0
        }
      },
      "format": {"property": "aggregations"},
      "transform": [
        {
          "type": "fold",
          "fields": [
            "spend_sum_per_name_0_to_50",
            "spend_sum_per_name_50_to_100",
            "spend_sum_per_name_100_to_150",
            "spend_sum_per_name_150_to_inf"
          ],
          "as": ["aggregations", "vals"]
        }
      ]
    }
  ],
  "scales": [
    {
      "name": "yscale",
      "type": "linear",
      "zero": true,
      "domain": {"data": "spends", "field": "vals.value"},
      "range": "height"
    },
    {
      "name": "xscale",
      "type": "band",
      "domain": {"data": "spends", "field": "aggregations"},
      "range": "width",
      "padding": 0.05
    }
  ],
  "marks": [
    {
      "type": "rect",
      "from": {"data": "spends"},
      "encode": {
        "update": {
          "x": {"scale": "xscale", "field": "aggregations"},
          "width": {"scale": "xscale", "band": 1},
          "y": {"scale": "yscale", "field": "vals.value"},
          "y2": {"scale": "yscale", "value": 0}
        }
      }
    }
  ],
  "axes": [
    {"scale": "yscale", "orient": "left"},
    {"scale": "xscale", "orient": "bottom"}
  ]
}

我现在可以显示这张图了:

enter image description here

我知道它有一些限制,比如如何改变直方图的范围,还有很多硬编码的脚本,但由于我找不到正确的方法,所以我用这种方式解决了。如果有人想出更优雅的方法来解决这个问题,请发帖作为答案!

关于elasticsearch - Kibana 垂直条形图在 X 轴的哪个位置我有值总和的桶?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59395904/

相关文章:

elasticsearch - 将索引名称中的字段用于 elasticsearch 插件 logstash

elasticsearch - Elasticsearch 中多个字段上的单词搜索

python - matplotlib/Python 中条形图的单独标记条

python - 如何绘制一列平均值的直方图,而 bin 由 Pandas 中的另一列定义

elasticsearch - 用于自定义日志的Logstash筛选器Grok

elasticsearch - Kibana没有使用Elasticsearch映射

elasticsearch - ElasticSearch找不到我的脚本

elasticsearch - 更新Elasticsearch中现有字段的映射索引参数

matplotlib - Matplotlib 中带有边缘 KDE 图和多个类别的散点图

ssl - 在 kibana 上安装防护罩会出现 PEM 错误