在 Elasticsearch 中将一个字段的值拆分为多个字段的值

问题描述 投票:0回答:1

我使用gdal和ogr将osm数据导入到elasticsearch的索引中。现在数据集看起来像这样:

            {
            "_index": "points",
            "_id": "ttZCjIwB1FY7TO4ET-AK",
            "_score": 6.103035,
            "_source": {
                "ogc_fid": 24862,
                "geometry": {
                    "type": "Point",
                    "coordinates": [
                        8.7037536,
                        48.8916509
                    ]
                },
                "osm_id": "3330289083",
                "name": "Amt für Umweltschutz",
                "other_tags": "\"addr:city\"=>\"Pforzheim\",\"addr:country\"=>\"DE\",\"addr:housenumber\"=>\"9\",\"addr:postcode\"=>\"75175\",\"addr:street\"=>\"Östliche Karl-Friedrich-Straße\",\"government\"=>\"environment\",\"office\"=>\"government\""
            }
        }

由于 OSM 数据结构,地址数据已导入到字段中

other_tags

为了创建更简单的 Elasticsearch 查询,我更喜欢这样的索引结构:

            {
            "_index": "points",
            "_id": "ttZCjIwB1FY7TO4ET-AK",
            "_score": 6.103035,
            "_source": {
                "ogc_fid": 24862,
                "geometry": {
                    "type": "Point",
                    "coordinates": [
                        8.7037536,
                        48.8916509
                    ]
                },
                "osm_id": "3330289083",
                "name": "Amt für Umweltschutz",
                "city": "Pforzheim",
                "country": "DE",
                "housenumber": "9",
                "postcode": "75175",
                "street": "Östliche Karl-Friedrich-Straße"
            }
        }

我读到可以使用 Logstash 来改变数据,并且有很多例子来说明改变过滤器函数的样子。我搜索了 4 个小时,但找不到如何使用 Logstash 及其 mutate 过滤器。

有人能准确地告诉我实现目标的步骤是什么吗?我需要安装什么东西吗?我需要连接到elasticsearch服务器并使用一些命令吗?或者可以通过请求elasticsearch api来实现吗?

谢谢

elasticsearch logstash
1个回答
0
投票

如果您使用 Logstash 导入此数据,则最好使用

kv
过滤器 解析
other_tags
中的地址数据,然后使用
mutate/rename
过滤器从字段名称中删除
addr:
前缀,像这样:

filter {
  ...
  kv {
     source => 'other_tags'
     field_split => ','
     value_split_pattern => '=>'
     remove_char_key => '"'
     remove_char_value => '"'
  }
  mutate {
    rename => { 
      "addr:city" => "city" 
      "addr:country" => "country" 
      "addr:housenumber" => "housenumber" 
      "addr:postcode" => "postcode" 
      "addr:street" => "street" 
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.