0

我想将 geoip 的旧数据重新索引到地理点。

以前的数据包含这种格式的位置。

"geoip": {
    "location": {
        "lon": 67.0703,
        "lat": 24.9206
    }
} 

我想像这样在数组中重新索引地理点中的位置

"geoip": {
    "location": [lon, lat]
} 

这是映射

PUT logs-audit-geopoint/_mapping/doc
{
  "properties": {
    "json":{
      "properties": {
        "geoip":{
          "properties":{
            "location": {
              "type": "geo_point"
            }
          }
        }
      }
    }
  }
}

这是我执行重新索引的请求。

POST _reindex
{
  "source": {
    "index": "logs-audit"
  },
  "dest": {
    "index": "logs-audit-geopoint"
  },
  "script": {
     "source": "def geoip = ctx._source.json.geoip; if(geoip != null) { geoip.location = [geoip.longitude, geoip.latitude]; }",
      "lang": "painless"
    }
}

质疑 它不会覆盖位置:{} 到位置:[]

4

1 回答 1

1

使用临时索引来转换数据:

日志审核(源)
测试(临时)
日志审核地理点(目标)

逐步迁移过程:

1- 使用新变量 location_new 从源索引 [logs-audit] 转移到 [test] 索引(为空,无映射)。

    POST _reindex
    {
      "source": {
        "index": "logs-audit"
      },
      "dest": {
        "index": "test"
      },
      "script": {
         "source": "def geoip = ctx._source.json.geoip; if(geoip != null && geoip != '' ) { geoip.location = null; geoip.location_new = [geoip.longitude, geoip.latitude] }",
          "lang": "painless"
        }
    }

2-使用以下映射创建新索引(geoip.location = geo_point)

    PUT logs-audit-geopoint/_mapping/doc
    {
      "properties": {
        "json":{
          "properties": {
            "geoip":{
              "properties":{
                "location": {
                  "type": "geo_point"
                }
              }
            }
          }
        }
      }
    }

3- 然后从测试索引转移到新索引。

    POST _reindex
    {
      "source": {
        "index": "test"
      },
      "dest": {
        "index": "logs-audit-geopoint"
      },
      "script": {
         "source": "def geoip = ctx._source.json.geoip; if(geoip != null && geoip != '' ) { geoip.location = geoip.location_new }",
          "lang": "painless"
        }
    }
于 2018-03-20T08:01:28.737 回答