表示値を別フィールドの値にする

グラフを作成する際にX軸をユーザIDで分割するさいに軸に表示される値をユーザ名にするような方法はありますでしょうか。

Kibanaは 6.8.2です。

image

上記のようなデータで、重複の可能性があるのでIDで分割は行うが表示はユーザ名としたい形です。

@hashimoto さん、通常のVisualizationではできなさそうですね。ちょっと小難しくなりますが、Vegaを使うとやりたいことはできると思います。こちらで試しにやってみました。ご参考になれば。

サンプルデータ登録:

POST forum_229404/_bulk
{"index": {}}
{"userId": "a", "userName": "あ", "code": "x"}
{"index": {}}
{"userId": "b", "userName": "べ", "code": "x"}
{"index": {}}
{"userId": "c", "userName": "し", "code": "x"}
{"index": {}}
{"userId": "a", "userName": "あ", "code": "y"}
{"index": {}}
{"userId": "a", "userName": "あ", "code": "z"}
{"index": {}}
{"userId": "b", "userName": "べ", "code": "z"}
{"index": {}}
{"userId": "a", "userName": "あ", "code": "z"}

アグリゲーションリクエストのテスト。
termsアグリゲーションしつつ、それ以外のフィールドを参照するためにtop_hitsも使っているのがミソです。

GET forum_229404/_search
{
  "size": 0,
  "aggs": {
    "userIds": {
      "terms": {
        "field": "userId.keyword", "size": 10
      },
      "aggs": {
        "doc": {"top_hits": {"size": 1}}}}}
}

KibanaのVisualizationをVegaで作成:

{
  "$schema": "https://vega.github.io/schema/vega/v4.3.0.json",
  "title": "表示値を別フィールドの値にする",
  "data": [
    {
      "name": "es",
      "url": {
        "%context%": true,
        "index": "forum_229404",
        "body": {
          "aggs": {
            "userIds": {
              "terms": {"field": "userId.keyword", "size": 10},
              "aggs": {"doc": {"top_hits": {"size": 1}}}
            }
          },
          "size": 0
        }
      },
      "format": {"property": "aggregations.userIds.buckets"}
    }
  ],
  "scales": [
    {
      "name": "xscale",
      "type": "band",
      "domain": {"data": "es", "field": "key"},
      "range": "width",
      "padding": 0.05,
      "round": true
    },
    {
      "name": "yscale",
      "domain": {"data": "es", "field": "doc_count"},
      "nice": true,
      "range": "height"
    }
  ],
  "axes": [
    {"orient": "bottom", "scale": "xscale", "labelFontSize": 36},
    {"orient": "left", "scale": "yscale", "labelFontSize": 24}
  ],
  "marks": [
    {
      "type": "rect",
      "from": {"data": "es"},
      "encode": {
        "enter": {
          "x": {"scale": "xscale", "field": "key"},
          "width": {"scale": "xscale", "band": 1},
          "y": {"scale": "yscale", "field": "doc_count"},
          "y2": {"scale": "yscale", "value": 0}
        },
        "update": {"fill": {"value": "steelblue"}},
        "hover": {"fill": {"value": "red"}}
      }
    },
    {
      "type": "text",
      "from": {"data": "es"},
      "encode": {
        "enter": {
          "x": {"scale": "xscale", "signal": "datum.key", "band": 0.5},
          "y": {"scale": "yscale", "signal": "datum.doc_count", "offset": -2},
          "align": {"value": "center"},
          "baseline": {"value": "bottom"},
          "fill": {"value": "#333"},
          "text": {"field": "doc.hits.hits[0]._source.userName"},
          "fontSize": {"value": 24}
        }
      }
    }
  ]
}