我可以使用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
分析器应用于文本字段,除非您明确提供另一个分析器。更多信息here和here。
您可以使用以下方法检查标准分析仪之后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/