【问题标题】:CSV geodata into elasticsearch as a geo_point type using logstash使用logstash将CSV地理数据作为geo_point类型转换为elasticsearch
【发布时间】:2016-03-07 12:59:35
【问题描述】:

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

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

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 时,它​​表明文档中没有位置:geo_point 类型在其中...而是 lat 和 lon 的两个双精度值。

$ 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 类型进入弹性搜索?

最后,我希望能够使用如下命令对 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 logstash


    【解决方案1】:

    问题在于,在您的elasticsearch 输出中,您将索引命名为base_map_simple,而在您的模板中,template 属性为base_map_template,因此在创建新索引时未应用模板。 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
    

    【讨论】:

    • 运行logstash时出现以下错误Unexpected character ('"' (code 34)): was expecting comma to separate OBJECT entries at [Source: [B@41132e21; line: 12, column: 9] {:class=&gt;"LogStash::Json::ParserError", :level=&gt;:error}
    • 很奇怪,它对我来说效果很好。你确定你复制/粘贴了上面的模板(并删除了&lt;--- change this 字符)?
    • 另外注意需要先删除当前索引以及模板,即curl -XDELETE localhost:9200/base_map_simple + curl -XDELETE localhost:9200/_template/logstash
    • 啊,谢谢,但是在按照建议调整运行请求curl -XGET 'localhost:9200/base_map_simple?pretty' 的结果后,它的结果与问题中建议的结果相同...
    • 你能用curl -XGET localhost:9200/_template展示你得到了什么吗?
    猜你喜欢
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    • 2022-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多