代码之家  ›  专栏  ›  技术社区  ›  Bardo

使用logstash在ELK上获取城市名称的地理位置

  •  0
  • Bardo  · 技术社区  · 2 年前

    因此,这是我们的用例:

    我们有一个摄取过程,每天将大约1000种元素加载到ES指数中。该索引的一个字段是城市名称,但我们想按城市详细绘制一些带有元素的地图,但我们没有这些城市的地理位置。

    通常,我们的数据城市将来自非常有限的收集,但(这是一个很大的但)我们可以不时地从完全出乎意料的地方获得新的城市。因此,我们不需要对世界上每个城市及其地理位置进行精确的索引(正如你可以从地理名称中获得的那样),但我们肯定必须不时检查几个城市的地理位置。

    换句话说,我的方法如下: 我想在我们的logstash ETL过程中添加一个在ES索引中查找城市的查询,如果城市在那里,它可以从这个城市索引中获取它的地理位置,如果没有,我想查询API地理名称以查找城市的地理位置并将其存储在我们的ES城市索引中。这样,我们只需要不时地查询API中的新城市,一旦一个城市被纳入我们的城市指数,我们就不必再查询它了。

    这对ELK来说是个好方法吗?或者还有更好的方法我看不到?请记住,我是ELK堆栈中的新手。

    1 回复  |  直到 2 年前
        1
  •  -4
  •   Om Patil    2 年前

    您的方法对您的用例是有意义的,并且它是在Elasticsearch和ELK(Elasticsearch、Logstash和Kibana)堆栈中处理地理位置数据的合理方法。以下是一些注意事项和步骤,可以帮助您实现它:

    1. 创建城市指数: 首先在Elasticsearch中创建一个索引来存储您的城市地理位置数据。此索引可以包含以下字段 city_name , latitude , longitude

    2. Ingest城市数据: 使用您已经知道的城市的地理位置数据填充此索引。您可以手动输入此数据,也可以使用自动流程。

    3. 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键调整配置。

    4. 定期更新: 建立一个定期的工作来检查新的城市并更新你的城市指数。这可以通过使用cron或作业调度程序等工具的调度任务来完成。

    5. 索引模板: 考虑为您的城市索引定义一个索引模板,以确保未来文档的映射一致。

    请记住,地理名称API可能有速率限制,因此请注意查询频率。此外,请确保妥善处理错误,以防API无法访问或返回意外响应。

    这种方法允许您维护已知城市地理位置的本地索引,同时根据需要动态添加新城市。这是一个处理预期和意外城市数据的实用解决方案。