json - Kibana查询DSL:如何在包含JSON语法的文本值字段上应用正则表达式过滤器

标签 json regex elasticsearch kibana

我可以使用Kibana访问Elasticsearch实例的数据。
数据内有一个包含字符串的文本字段。
此字符串(文本字段)看起来像JSON,但不是。
这里是区别(请关注 JSON 中的“消息”键):
如果展开文档以显示带有小“已打开的文件夹”图标的“展开的文档” View ,则可以选择两个选项卡“表格”和“JSON”。
选择“JSON”。
然后您将看到以下情况:

{
    "_index": "kibana_sample_data",
    "_type": "_doc",
    "_id":"someString",
    "_version": 1,
    "_score": null,
    "_source":{
        "first_key":"some string",
        "message": 
        "{
          \"length\": 11.99,
          \"percentage\": 0,
          \"name\": \"foo\",
          \"category\": \"bar\",
          \"sub_msg\": \"M001: This is a message-code.\"
        }"
    }                
}
如您所见,应该为JSON的message-key值只是一个字符串,并且所有键和值信息均已转义(数字值除外)。
我应该看到使用GUI过滤器轻松选择它的是一个像这样的JSON:
{
    "_index": "kibana_sample_data",
    "_type": "_doc",
    "_id":"someString",
    "_version": 1,
    "_score": null,
    "_source":{
        "first_key":"some string",
        "message": 
        {
          "length": 11.99,
          "percentage": 0,
          "name": "foo",
          "category": "bar",
          "sub_msg": "M001: This is a message-code"
        }
    }                
}
我现在要尝试的是使用查询DSL和正则表达式提取键“sub_msg” 的值。但是我什至无法找到所有带有正确的消息键值(字符串)开头字符的匹配项。
更详细地, Elasticsearch 查询DSL部分:
{
  "query": {
    "regexp": {
      "message": "{.*"
    }
  }
}
但是搜索没有任何匹配。
它匹配的是如果我尝试在消息中搜索像这样的键:
{
  "query": {
    "regexp": {
      "message": "sub_msg"
    }
  }
}
我可以而不是做的是在消息中搜索相应的值,如下所示:
{
  "query": {
    "regexp": {
      "message": "M001: This is a message-code"
    }
  }
}
我的实际目标是在“sub_msg” -key的值内查询类似“M001:。*” 的日志消息代码。利用这些查询结果,我想创建一个简单的仪表板。
不幸的是,我觉得我现在处于死胡同。
我还尝试了诸如在查询DSL中的实际反斜杠上添加一些“\”来转义该值的转义字符的操作。这在Kibana中引发了异常。

最佳答案

问题是,像json一样的字符串在被索引时会被除去特殊字符,这大概是由于默认的standard分析器应用于文本字段,除非您明确提供另一个分析器。更多信息herehere
您可以使用以下方法检查标准分析仪之后message的内容:

GET _analyze
{
  "text": "{\"length\": 11.99, \"percentage\": 0, \"name\": \"foo\", \"category\": \"bar\",\"sub_msg\": \"M001: This is a message-code.\"}",
  "analyzer": "standard"
}
快速解决:
GET kibana_sample_data/_search
{
  "query": {
    "regexp": {
      "message.keyword": "{.*"
    }
  }
}
要么
{
  "query": {
    "regexp": {
      "message.keyword": ".*\"M001: This is a message-code.\".*"
    }
  }
}

长期修复:找出一种摄取json的方法,因为不必再重新输入类似json的字符串就可以摄取json。

关于json - Kibana查询DSL:如何在包含JSON语法的文本值字段上应用正则表达式过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62901313/

相关文章:

C++ 使用单词列表作为分隔符拆分字符串

php - PHP 中的 elasticsearch 查询和 cURL

elasticsearch - Elastic Search获取索引API以获取30天以上的索引

JSON-LD 缺少 '}' 或对象成员名称。错误

java - 无法从 javascript 获取 json 到运行中的 java

regex - 如何使用 FFmpeg 从 Mp3 中提取歌词(USLT 帧)?

c# - Elastic Search Nest-比较两个字段

json - 将文件读入 JSON

javascript - Highcharts csv 数据加载并解析为单独的数组和 json

正则表达式高尔夫 : Cut off everything after the last "/"