首页 文章

如何通过字段的子字符串或正则表达式来制作Kibana图?

提问于
浏览
7

我有一个带Kibana的ElasticSearch实例,它拥有我在几年内积累的大量用户级应用数据 . 其中一个字段是用户正在运行的Java版本 .

我有理由过渡到更新的版本 . 不幸的是,我找不到将 1.6.0_311.6.0_321.6.0_371.6.0_51 汇总为单个 1.6 条目的方法,因此该图表现在几乎无法读取 .

在Kibana中有没有办法聚合数据,比如'scripted field'我可以写一个正则表达式?例如 . simplified_java: osjv % '\d\.\d'simplified_java 定义为 osjv 字段的一部分,该字段与数字后跟一个点后跟一个数字相匹配 .

目前看起来Kibana只支持数字脚本字段,这使得这很难 . 我没有使用LogStash,因为我没有真正使用'logs',而是我的桌面应用程序中的自定义事件报告框架(选择加入)报告使用统计信息,所以不幸的是我不能使用它的任何功能 .

我可以手动完成它,但我已经导入了2G的事件数据,我不想再这样做了,只为可计算的内容添加一个新字段...... :(

有没有办法在Kibana中创建基于子字符串或正则表达式的字段,或者(失败)告诉ElasticSearch透明地做同样的事情?

1 回答

  • 0

    你肯定可以在Kibana中对Elasticsearch中的字符串数据执行脚本字段,前提是它被映射为 keyword 类型 . 有关更多信息,请参阅the scripted field documentation;有关更好的示例,请参阅the scripted field blog post .

    简而言之,您可以通过构建返回子字符串的脚本字段来执行您要查找的内容:

    def version = doc['osjv'].value; return (version != null) ? v.substring(0, v.lastIndexOf(".")-1) : version;
    

    请记住,脚本字段存在性能影响,因为每次查看脚本字段时都会运行它们 .

    更好的方法是使用 simplified_java 值在文档中创建新字段 . 您不需要从源重新获取所有数据,而是可以执行Update By Query . 您的查询只是 match_all{} ,然后您可以定义创建新字段的脚本 . 所以是的,有索引发生,但发生了"in place":

    POST your-index/_update_by_query
    {
      "script": {
        "source": "def version = ctx._source.osjv; ctx._source.simplified_java = (version != null) ? version.substring(0, version.lastIndexOf(".")-1) : version",
        "lang": "painless"
      },
      "query": {
        "match_all": {}
      }
    }
    

    ...没有测试过这些脚本中的任何一个,但看起来像它们!

相关问题