您的方法对您的用例是有意义的,并且它是在Elasticsearch和ELK(Elasticsearch、Logstash和Kibana)堆栈中处理地理位置数据的合理方法。以下是一些注意事项和步骤,可以帮助您实现它:
-
创建城市指数:
首先在Elasticsearch中创建一个索引来存储您的城市地理位置数据。此索引可以包含以下字段
city_name
,
latitude
,
longitude
等
-
Ingest城市数据:
使用您已经知道的城市的地理位置数据填充此索引。您可以手动输入此数据,也可以使用自动流程。
-
Logstash ETL过程:
在Logstash ETL过程中,当您遇到具有城市名称的新元素时,请在城市索引中执行查找。如果找到了城市,请使用其地理位置。如果不是,请查询地理名称API以获取地理位置,然后将其存储在城市索引中。
Logstash配置示例:
filter {
if ![geo_location] {
elasticsearch {
hosts => ["your_elasticsearch_host"]
index => "cities"
query => "city_name:%{[city_field]}"
fields => { "geo_location" => "geo_location" }
add_field => { "city_found" => "true" }
}
}
}
output {
if [city_found] != "true" {
http {
url => "https://api.geonames.org/searchJSON?q=%{[city_field]}&username=your_geonames_username"
verb => "GET"
target_body => "[geo_location]"
}
elasticsearch {
hosts => ["your_elasticsearch_host"]
index => "cities"
document_id => "%{[city_field]}"
}
}
}
根据实际字段名称、URL和API键调整配置。
-
定期更新:
建立一个定期的工作来检查新的城市并更新你的城市指数。这可以通过使用cron或作业调度程序等工具的调度任务来完成。
-
索引模板:
考虑为您的城市索引定义一个索引模板,以确保未来文档的映射一致。
请记住,地理名称API可能有速率限制,因此请注意查询频率。此外,请确保妥善处理错误,以防API无法访问或返回意外响应。
这种方法允许您维护已知城市地理位置的本地索引,同时根据需要动态添加新城市。这是一个处理预期和意外城市数据的实用解决方案。