You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Logstash拆分Elasticsearch中OSM数据的other_tags字段为多字段

拆分Elasticsearch中OSM数据的other_tags字段为独立地址字段完整方案

需要安装的工具

  • Logstash:核心处理工具,负责数据的读取、转换与写入
  • (已部署的)Elasticsearch:需确保与Logstash大版本一致(比如同属7.x或8.x系列),避免兼容性问题
  • 可选:Kibana,用于快速验证转换后的数据结构与内容

操作方式说明

无需直接连接ES执行命令或调用API,而是通过Logstash搭建数据处理管道:从ES的points索引读取原始数据,拆分other_tags字段后写入新的ES索引(建议先写入新索引验证,再替换原索引)。

完整实现步骤

1. 确认版本兼容

先查询Elasticsearch版本(可通过GET /请求查看),再安装对应大版本的Logstash,比如ES为7.17.x,就安装Logstash 7.17.x系列。

2. 编写Logstash配置文件

创建配置文件(例如命名为osm-split.conf),包含input(读数据)、filter(转数据)、output(写数据)三个核心模块:

输入模块:从ES读取原数据

input {
  elasticsearch {
    hosts => ["http://你的ES服务器地址:9200"] # 替换为实际ES地址
    index => "points" # 原索引名称
    query => '{ "query": { "match_all": {} } }' # 读取索引内所有数据
    scroll => "5m" # 批量读取超时时间,数据量大时可适当调长
    docinfo => true # 保留原文档ID等元数据
  }
}

过滤模块:拆分other_tags字段

根据你的other_tags实际格式选择对应配置:

情况A:other_tags为JSON格式字符串

例:other_tags值为{"city":"成都","housenumber":"101","country":"中国"}

filter {
  # 将JSON字符串解析为嵌套字段
  json {
    source => "other_tags"
    target => "address_temp"
  }
  # 提取需要的地址字段到根级别
  mutate {
    add_field => {
      "city" => "%{[address_temp][city]}"
      "housenumber" => "%{[address_temp][housenumber]}"
      "country" => "%{[address_temp][country]}"
      # 按需添加其他字段,如postcode、street等
    }
    # 可选:删除临时字段与原other_tags,减少数据体积
    remove_field => ["address_temp", "other_tags"]
  }
}
情况B:other_tags为OGR导出的键值对格式

例:other_tags值为'city=>成都, housenumber=>101, country=>中国'

filter {
  # 解析键值对格式字符串
  kv {
    source => "other_tags"
    field_split => ", "
    value_split => "=>"
    target => "address_temp"
  }
  # 提取地址字段到根级别
  mutate {
    add_field => {
      "city" => "%{[address_temp][city]}"
      "housenumber" => "%{[address_temp][housenumber]}"
      "country" => "%{[address_temp][country]}"
    }
    remove_field => ["address_temp", "other_tags"]
  }
}

输出模块:写入新索引

output {
  elasticsearch {
    hosts => ["http://你的ES服务器地址:9200"]
    index => "points_processed" # 新索引名称,避免覆盖原数据
    document_id => "%{[@metadata][_id]}" # 保留原文档ID,防止数据重复
  }
  # 可选:输出到控制台,实时查看转换结果
  stdout {
    codec => rubydebug
  }
}

3. 运行Logstash执行转换

打开终端,进入Logstash安装目录,执行命令:

# Linux/macOS系统
./bin/logstash -f /path/to/osm-split.conf

# Windows系统
bin\logstash.bat -f C:\path\to\osm-split.conf

等待Logstash处理完所有数据(终端会显示处理进度)。

4. 验证转换结果

通过Kibana Dev Tools或curl查询新索引:

GET /points_processed/_search
{
  "query": { "match_all": {} },
  "_source": ["city", "housenumber", "country"]
}

确认返回结果中已生成独立的地址字段。

5. 替换原索引(可选)

若验证无误,可将新索引数据导回原索引:

# 用_reindex将数据同步回原索引
POST /_reindex
{
  "source": { "index": "points_processed" },
  "dest": { "index": "points" }
}

# 删除临时索引
DELETE /points_processed

内容的提问来源于stack exchange,提问作者heikorm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 22:37:02