重新索引期间弹性搜索无痛脚本问题

时间:2018-03-19 13:08:40

标签: elasticsearch elastic-stack elasticsearch-painless

我想将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"
    }
}

问题 它不会覆盖位置:{}到位置:[]

1 个答案:

答案 0 :(得分:1)

使用临时索引转换数据:

  

日志审计(源)
  试验(临时)
  日志-审计的GeoPoint(目的地)

逐步迁移过程:

  

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

    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"
        }
    }