《Elastic Stack 实战手册》——四、应用实践——4.2 可观测性应用场景 ——4.2.6.运用Elastic Stack分析COVID-19数据(2) https://developer.aliyun.com/article/1225616
解析信息
在上面我们已经很成功地把我们的信息转换为我们所希望的数据类型。接下来我们来使用 grok来解析我们的数据。grok 的数据解析,基本上是一种正则解析的方法。我们首先使用Kibana所提供的 Grok Debugger 来帮助我们分析数据。我们将使用如下的 grok pattern 来解析我们的message:
%{NUMBER:lat:float},%{NUMBER:lon:float},'%{DATA:address}',%{DATA:city},',',%{DATA:country},%{NUMBER:infected:int},%{NUMBER:death:int}
我们点击 Grok Debugger,并把我们的相应的文档拷入到相应的输入框中,并用上面的 grok pattern 来解析数据。上面显示,它可以帮我们成功地解析我们想要的数据。显然这个被解析的信息更适合我们做数据的分析。为此,我们需要重新修改 pipeline:
PUT _ingest/pipeline/covid19_parser { "processors": [ { "remove": { "field": ["log", "input", "ecs", "host", "agent"], "if": "ctx.log != null && ctx.input != null && ctx.ecs != null && ctx.host != null && ctx.agent != null" } }, { "gsub": { "field": "message", "pattern": "\"", "replacement": "'" } }, { "grok": { "field": "message", "patterns": [ "%{NUMBER:lat:float},%{NUMBER:lon:float},'%{DATA:address}',%{DATA:city},',',%{DATA:country},%{NUMBER:infected:int},%{NUMBER:death:int}" PUT _ingest/pipeline/covid19_parser { "processors": [ { "remove": { "field": ["log", "input", "ecs", "host", "agent"], "if": "ctx.log != null && ctx.input != null && ctx.ecs != null && ctx.host != null && ctx.agent != null" } }, { "gsub": { "field": "message", "pattern": "\"", "replacement": "'" } }, { "grok": { "field": "message", "patterns": [ "%{NUMBER:lat:float},%{NUMBER:lon:float},'%{DATA:address}',%{DATA:city},',',%{DATA:country},%{NUMBER:infected:int},%{NUMBER:death:int}" ] } } ] }
我们运行上面的 pipeline,并使用如下的命令来重新对数据进行分析:
POST covid19/_update_by_query?pipeline=covid19_parser
我们重新来查看文档:
在上面我们可以看到新增加的 country,infected,address 等等的字段。
添加location字段
在上面我们可以看到 lon 及 lat 字段。这些字段是文档的经纬度信息。这些信息并不能为我们所使用,因为首先他们是分散的,并不处于一个通过叫做 location 的字段中。为此,我们需要创建一个新的 location 字段。为此我们更新 pipeline 为:
PUT _ingest/pipeline/covid19_parser { "processors": [ { "remove": { "field": ["log", "input", "ecs", "host", "agent"], "if": "ctx.log != null && ctx.input != null && ctx.ecs != null && ctx.host != null && ctx.agent != null" } }, { "gsub": { "field": "message", "pattern": "\"", "replacement": "'" } }, { "grok": { "field": "message", "patterns": [ "%{NUMBER:lat:float},%{NUMBER:lon:float},'%{DATA:address}',%{DATA:city},',',%{DATA:country},%{NUMBER:infected:int},%{NUMBER:death:int}" ] } }, { "set": { "field": "location.lat", "value": "{{lat}}" } }, { "set": { "field": "location.lon", "value": "{{lon}}" } } ] }
在上面我们设置了一个叫做 location.lat 及 location.lon 的两个字段。它们的值分别是 {{lat}}及 {{lon}}。我们执行上面的命令。
由于 location 是一个新增加的字段,在默认的情况下,它的两个字段都会被 Elasticsearch 设置为 text 的类型。为了能够让我们的数据在地图中进行显示,它必须是一个 geo_point 的数据类型。为此,我们必须通过如下命令来设置它的数据类型:
PUT covid19/_mapping { "properties": { "location": { "type": "geo_point" } } }
执行上面的指令,我们再使用如下的命令来对我们的数据重新进行处理:
POST covid19/_update_by_query?pipeline=covid19_parser
等执行完上面的命令后,我们重新来查看我们的文档:
从上面我们可以看到一个叫做 location 的新字段。它含有 lon 及 lat 两个字段。我们同时也可以查看 covid19 的 Mapping。
GET covid19/_mapping
我们可以发现 Location 的数据类型为:
"location" : { "type" : "geo_point" }
它显示 location 的数据类型是对的。
到目前为止,我们已经成功地把数据导入到 Elasticsearch 中。我们接下来针对 covid19 来进行数据分析。
《Elastic Stack 实战手册》——四、应用实践——4.2 可观测性应用场景 ——4.2.6.运用Elastic Stack分析COVID-19数据(4) https://developer.aliyun.com/article/1225614