将现有字段映射转换为geoip

时间:2015-11-04 12:38:33

标签: elasticsearch logstash

我已经使用logstash解析了一个日志文件并将其放入elasticsearch中。我有一个名为IP的字段,现在它被映射为字符串。我想将elasticsearch中的现有映射转换为geoip而不再运行logstash。我在这个领域的elasticsearch中有几百万条记录。我想在所有记录中将IP从字符串映射转换为geoip。

1 个答案:

答案 0 :(得分:3)

我担心你仍然需要使用Logstash,因为geoip是一个Logstash过滤器,Elasticsearch本身无法访问GeoIP数据库。

不用担心,您不需要在原始日志行上重新运行Logstash,只需使用elasticsearch input插件和elasticsearch output插件重新编制ES文档索引即可通过在{between}之间添加geoip filter来将IP字段转换为geoip字段。

由于您无法修改当前IP字段从stringgeo_point的映射,因此我们需要确保您的索引已准备好接收GeoIP数据。如果索引已在映射中包含geoip字段(由Logstash使用其预定义的标准logstash-*模板创建),请首先使用以下命令进行检查。

curl -XGET localhost:9200/logstash-xyz/_mapping

如果您在上述命令的输出中看到geoip字段,那么您很高兴。否则,我们首先需要创建类型为geoip的<{1}}字段:

geo_point

现在您的映射已准备好接收GeoIP数据。接下来,我们创建一个名为curl -XPUT localhost:9200/logstash-xyz/_mapping/your_type -d '{ "your_type": { "properties": { "geoip": { "type": "object", "dynamic": true, "properties": { "ip": { "type": "ip", "doc_values": true }, "location": { "type": "geo_point", "doc_values": true }, "latitude": { "type": "float", "doc_values": true }, "longitude": { "type": "float", "doc_values": true } } } } } }' 的Logstash配置文件,如下所示:

geoip.conf

然后在设置正确的值(主机+索引)后,您可以使用input { elasticsearch { hosts => "localhost:9200" index => "logstash-xyz" } } filter { mutate { remove_field => [ "@version", "@timestamp" ] } geoip { source => "IP" <--- the field containing the IP string } } output { elasticsearch { host => "localhost" port => 9200 protocol => "http" manage_template => false index => "logstash-xyz" document_id => "%{id}" workers => 1 } } 运行它。运行此文件后,您的文档应包含一个名为bin/logstash -f geoip.conf的新字段,其中包含GeoIP信息。

我建议您直接将geoip过滤器添加到正常的logstash配置中。