在仪表板上使用时间过滤器更改基巴纳州Vega的范围

时间:2019-11-22 00:54:02

标签: elasticsearch kibana vega

我正在使用Kibana 7.1。

我已经成功创建了Vega线图。我可以允许它显示月份数据,但是我希望用户在仪表板上使用时间过滤器,并允许vega可视化随之更改。

https://www.elastic.co/blog/getting-started-with-vega-visualizations-in-kibana和Vega文档中,我读到了插入

  "%context%": true,
  "%timefield%": "@timestamp"

内部url将解决此问题,但是当我这样做时,它给了我 url.%context% and url.%timefield% must not be used when url.body.query is set

我完整的elasticsearch代码如下:

  "data": {
    "url": {
      "%context%":"true",
      "index": "access_log",
      "body": {
        "query": {
          "bool": {
            "must": [
              {"term": {"request_1": "rent"}},
              {"term": {"status": 200}}
            ]
          }
        },
        "aggs": {
          "histo": {
            "date_histogram": {
              "field": "date",
              "interval": "day"
            },
            "aggs": {
              "start_agg": {
                "filter": {
                  "term": {"request_2": "start"}
                }
              },
              "check_agg": {
                "filter": {
                  "term": {"request_2": "check"}
                }
              },
              "start_check": {
                "bucket_script": {
                  "buckets_path": {
                    "start_count": "start_agg._count",
                    "check_count": "check_agg._count"
                  },
                  "script": "params.start_count / params.check_count"
                }
              }
            }
          }
        }
      }
    },
    "format": {
      "property": "aggregations.histo.buckets"
    }
  },
  "mark": {
    "type":"line"
  },
  "encoding": {
    "x": {
      "field": "key",
      "type": "temporal",
      "axis": {"title": false}
    },
    "y": {
      "field": "start_check.value",
      "type": "quantitative",
      "axis": {"title": "Document count"}
    },
    "tooltip":[
      {"field":"start_check.value", 
       "type" : "quantitative"},
      {"field":"key",
       "type" :"temporal"}
    ]
  }
}

2 个答案:

答案 0 :(得分:0)

插入"%timefiled%":"date",其中date是我的工作领域之一。

答案 1 :(得分:0)

引用 Elastic's Vega reference for Kibana

<块引用>

使用 "%context%": true 或为 "%timefield%" 定义值时,正文不能包含查询。要在 VEGA 规范中自定义查询(例如,添加额外的过滤器,或移动时间过滤器),请定义您的查询并使用上面示例中的占位符。占位符将在解析后由仪表板或可视化的实际上下文替换。

他们所说的“上面的例子”如下:

{
  body: {
    query: {
      bool: {
        must: [
          // This string will be replaced
          // with the auto-generated "MUST" clause
          "%dashboard_context-must_clause%"
          {
            range: {
              // apply timefilter (upper right corner)
              // to the @timestamp variable
              @timestamp: {
                // "%timefilter%" will be replaced with
                // the current values of the time filter
                // (from the upper right corner)
                "%timefilter%": true
                // Only work with %timefilter%
                // Shift current timefilter by 10 units back
                shift: 10
                // week, day (default), hour, minute, second
                unit: minute
              }
            }
          }
        ]
        must_not: [
          // This string will be replaced with
          // the auto-generated "MUST-NOT" clause
          "%dashboard_context-must_not_clause%"
        ]
        filter: [
          // This string will be replaced
          // with the auto-generated "FILTER" clause
          "%dashboard_context-filter_clause%"
        ]
      }
    }
  }
}

而且,正如文档中已经定义的那样:

<块引用>
  • "%dashboard_context-must_clause%":由包含过滤器的对象替换的字符串
  • "%dashboard_context-filter_clause%":由包含过滤器的对象替换的字符串
  • "%dashboard_context-must_not_clause%":由包含过滤器的对象替换的字符串

因此,如果您想同时使用用户定义的过滤器或具有自定义查询的时间过滤器,则必须使用这三个字符串而不是 "%context%": true。它们将被 Kibana 解析并由 Elasticsearch 查询对象替换:一个用于“MUST”,一个用于“FILTER”,一个用于“MUST_NOT”。

像这样的简单模式可能会有用:

{
  body: {
    query: {
      bool: {
        must: [
          // {
          //   A "MUST" clause of yours
          // },
          "%dashboard_context-must_clause%"
        ]
        must_not: [
          // {
          //   A "MUST_NOT" clause of yours
          // },
          "%dashboard_context-must_not_clause%"
        ]
        filter: [
          // {
          //   A "FILTER" clause of yours
          // },
          "%dashboard_context-filter_clause%"
        ]
      }
    }
  }
}

如果您在某些类别中没有任何子句,只需保留相应的 "%dashboard_context-XXXXX_clause%" 字符串而不包含其他对象 - 就像第一个示例中的“FILTER”或“MUST_NOT”一样。