如何在Kibana数字中创建一个字段(来自字符串)

时间:2016-08-08 23:19:18

标签: elasticsearch kibana elastic-stack

我已经继承了日志的ELK堆栈,我还在学习绳索 - 我的任务是在我们的logstash索引上为某个类型设置两个字段数字。似乎无法弄清楚如何做到这一点。我试过的事情:

  1. 在Kibana设置页面中,转到我的logstash索引并找到该字段。在控件选项卡上编辑,看到类型列为String(并且它是不可变的)。格式下拉列表显示URL和字符串。
  2. 去了我的一个Elasticsearch主机并找到了文档类型的grok规则,发现它们确实被编写为将字段解析为数字。示例:%{NUMBER:response_code}
  3. 没有想法,因为我不知道我的方式绕过ELK堆栈。
  4. 任何帮助都非常感谢,特别是相关文档的链接,以便我能够理解正在发生的事情。如果我知道要谷歌的话,我会更加苦苦挣扎。

3 个答案:

答案 0 :(得分:3)

另请注意,%{NUMBER:response_code}不会从字符串中生成数字,它只是识别并解析字符串中的数字,但生成的response_code字段仍然是字符串,您需要使用mutate/convert filter转换为数字。 grok将始终将字符串解析为其他较小的字符串,将结果字段转换为您期望的类型是您的工作。

所以你需要在你的grok过滤器之后添加它:

  mutate {
    convert => { "response_code" => "integer" }
  }

从那时起,事件中的response_code将是一个整数,用于创建每日logstash索引的logstash template包含整数字段的特定动态模板。请注意,response_code字段只有在创建新的logstash索引后才是整数,现有索引不会更改。

答案 1 :(得分:1)

您需要reindex your data。由于此字段的Elasticsearch映射(即架构)已设置为string,因此您无法将数据索引为同一索引中的integer

典型的ELK设置将创建滚动索引(每天或每月),因此可以在索引之间从string切换到interger,但不建议这样做,因为它会干扰长期聚合和搜索。

正如您所发现的那样,更改Grok规则将有助于未来的数据。现在,您需要再次通过Logstash传递所有现有数据以应用新的ryles。

要执行此操作,您可以再次传递日志文件,也可以使用

从Elasticsearch读取Logstash
input {
  elasticsearch {
    hosts => "localhost"
  }
}

较新版本的Elasticsearch应通过提供原生reindex API来改善这一点。

答案 2 :(得分:0)

  1. 尝试查看文档样本:

    卷曲-XGET' localhost:9200 / _search?q =操作码:userLessonComplexityPoll& pretty'

  2. 让我们看看这些文档:

    {     " _index" :" myindex",     " _type" :" logs",     " _id" :" AWNoYI8pGmxxeL6jupEZ",     " _score" :1.0,     " _source" :{       "生产" :" 0",       " lessonId" :" 2144",       "操作码" :" userLessonComplexityPoll",       " courseId" :" 45",       " lessonType" :" minitest",       ...

  3. 因此,尝试转换一个文档:

    curl -XPOST' localhost:9200 / educa_stats - * / _ update_by_query?pretty' -d' {   "脚本":{     " lang":"无痛",     " source":" if(ctx._source.lessonId instanceof String){int lessonId = Integer.parseInt(ctx._source.lessonId); ctx._source.lessonId =(int)lessonId; }"   },   "查询":{     " bool":{       "条款":{         " _id":[" AWNoYI8pGmxxeL6jupEZ"," AWMcRJYFGmxxeL6jucIZ"]       }     }   } }'

  4. 成功?尝试通过查询转换所有文档:

    curl -XPOST 'localhost:9200/educa_stats-*/_update_by_query?pretty' -d '
    

    {   "脚本":{     " lang":"无痛",     " source":" if(ctx._source.lessonId instanceof String){int lessonId = Integer.parseInt(ctx._source.lessonId); ctx._source.lessonId =(int)lessonId; }"   },   "查询":{     " bool":{       "必须":[         {           "存在":{             " field":" lessonId"           }         }       ]     }   } }'

  5. 所有字段lessonId将从String类型转换为int(-2 ^ 32 - 2 ^ 32)类型。一切都好。