elasticsearch Kibana:基于字段子字符串的饼图切片,elasticsearch,kibana,elasticsearch,Kibana" /> elasticsearch Kibana:基于字段子字符串的饼图切片,elasticsearch,kibana,elasticsearch,Kibana" />

elasticsearch Kibana:基于字段子字符串的饼图切片

elasticsearch Kibana:基于字段子字符串的饼图切片,elasticsearch,kibana,elasticsearch,Kibana,我正在尝试创建一个饼图可视化,它将显示前10个传入请求。 我有一个搜索查询,它只过滤传入的请求,其中包含一个名为messages的字段,如下所示: “传入请求/api/someaction”。 如何基于/api/someaction部分而不是整个字符串进行聚合(因为“Incoming”被计算为一个术语) 或者…我可以创建自定义字段,例如,另一个字段的子字符串吗 谢谢如前所述,我已经找到了解决问题的方法。对我来说,我有像foo bar baz这样的值,我需要提取第一个单词。我可以使用“高级→ JS

我正在尝试创建一个饼图可视化,它将显示前10个传入请求。 我有一个搜索查询,它只过滤传入的请求,其中包含一个名为messages的字段,如下所示: “传入请求/api/someaction”。 如何基于/api/someaction部分而不是整个字符串进行聚合(因为“Incoming”被计算为一个术语)

或者…我可以创建自定义字段,例如,另一个字段的子字符串吗


谢谢

如前所述,我已经找到了解决问题的方法。对我来说,我有像
foo bar baz
这样的值,我需要提取第一个单词。我可以使用“高级→ JSON”字段,使用以下脚本:

{
    "script": "( _value.indexOf(' ') > 0 ? _value.substring(0, _value.indexOf(' ')) : _value )"
}
因此,在Kibana界面中,如下所示:


因此,在您的情况下,脚本可能应该是:

{
    "script": "( _value.indexOf(' ') > 0 ? _value.substring(_value.lastIndexOf(' ')) : _value )"
}
显然,这假设您要提取的消息部分位于字符串的最后一个空格之后

public class Foo {

    public static void main(String[] args){
        String tester = "Incoming request /api/someaction";
        String result = tester.substring(tester.lastIndexOf(" "));
        System.out.println(result);
    }

}
据我所知,您可以在JSON字段的“script”键中使用任何Java代码


不过我还没有测试过。如果有人对此有任何信息,请随时发表评论。

您是否使用Logstash或其他工具?如果使用Logstash,您的配置看起来如何?我相信有一种方法可以使用“高级"JSON输入。我目前也在研究这个问题,但到目前为止还没有找到什么。这个解决方案工作得很好。唯一的问题是,如果在仪表板中使用这个饼图,并单击一个切片,它将无法像通常那样成功地过滤仪表板。@Tomty我也注意到了这一点。这在某种程度上是有意义的。不幸的是但我看不出解决办法。