gpt4 book ai didi

elasticsearch - 使用 logstash 将 CSV 地理数据作为 geo_point 类型导入 elasticsearch

转载 作者:行者123 更新时间:2023-11-29 02:55:40 25 4
gpt4 key购买 nike

下面是我在使用最新版本的 logstash 和 elasticsearch 时遇到的问题的可重现示例。

我正在使用 logstash 将 csv 中的地理空间数据作为 geo_points 输入到 elasticsearch 中。

CSV 如下所示:

$ head simple_base_map.csv 
"lon","lat"
-1.7841,50.7408
-1.7841,50.7408
-1.78411,50.7408
-1.78412,50.7408
-1.78413,50.7408
-1.78414,50.7408
-1.78415,50.7408
-1.78416,50.7408
-1.78416,50.7408

我已经创建了一个如下所示的映射模板:

$ cat simple_base_map_template.json 
{
"template": "base_map_template",
"order": 1,
"settings": {
"number_of_shards": 1
},

"mappings": {
"node_points" : {
"properties" : {
"location" : { "type" : "geo_point" }
}
}
}
}

并有一个如下所示的 logstash 配置文件:

$ cat simple_base_map.conf 
input {
stdin {}
}

filter {
csv {
columns => [
"lon", "lat"
]
}

if [lon] == "lon" {
drop { }
} else {
mutate {
remove_field => [ "message", "host", "@timestamp", "@version" ]
}
mutate {
convert => { "lon" => "float" }
convert => { "lat" => "float" }
}

mutate {
rename => {
"lon" => "[location][lon]"
"lat" => "[location][lat]"
}
}
}
}

output {
stdout { codec => dots }
elasticsearch {
index => "base_map_simple"
template => "simple_base_map_template.json"
document_type => "node_points"
}
}

然后我运行以下命令:

$cat simple_base_map.csv | logstash-2.1.3/bin/logstash -f simple_base_map.conf 
Settings: Default filter workers: 16
Logstash startup completed
....................................................................................................Logstash shutdown completed

但是,当查看索引 base_map_simple 时,它​​表明文档中没有 location: geo_point 类型...而是 lat 和 lon 的两个 double 值。

$ curl -XGET 'localhost:9200/base_map_simple?pretty'
{
"base_map_simple" : {
"aliases" : { },
"mappings" : {
"node_points" : {
"properties" : {
"location" : {
"properties" : {
"lat" : {
"type" : "double"
},
"lon" : {
"type" : "double"
}
}
}
}
}
},
"settings" : {
"index" : {
"creation_date" : "1457355015883",
"uuid" : "luWGyfB3ToKTObSrbBbcbw",
"number_of_replicas" : "1",
"number_of_shards" : "5",
"version" : {
"created" : "2020099"
}
}
},
"warmers" : { }
}
}

我需要如何更改上述任何文件以确保它作为 geo_point 类型进入 Elasticsearch ?

最后,我希望能够使用如下命令对 geo_points 执行最近邻搜索:

curl -XGET 'localhost:9200/base_map_simple/_search?pretty' -d'
{
"size": 1,
"sort": {
"_geo_distance" : {
"location" : {
"lat" : 50,
"lon" : -1
},
"order" : "asc",
"unit": "m"
}
}
}'

谢谢

最佳答案

问题是,在您的 elasticsearch 输出中,您将索引命名为 base_map_simple,而在您的模板中,template 属性是 base_map_template,因此在创建新索引时未应用模板。 模板 属性 needs to somehow match为启动模板而创建的索引的名称。

如果您简单地将后者更改为 base_map_*,它将起作用,即:

{
"template": "base_map_*", <--- change this
"order": 1,
"settings": {
"index.number_of_shards": 1
},
"mappings": {
"node_points": {
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
}

更新

确保先删除当前索引以及模板,即

curl -XDELETE localhost:9200/base_map_simple
curl -XDELETE localhost:9200/_template/logstash

关于elasticsearch - 使用 logstash 将 CSV 地理数据作为 geo_point 类型导入 elasticsearch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35844409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com