1

我将一些数据记录到 Elasticsearch。但是我的模板效果不佳,并且我的位置数据映射为动态的。我想用查询脚本重新索引所有数据。如何将位置数据转换为 geoshape?

样本数据:

{
  "deviceId": "dev1",
  "location": {
     "type": "Point",
     "coordinates": [
          28.891983032226562,
          41.02446333535115
     ]
  }
}

type字段映射textcoordinates映射float

test3索引放置映射请求:

PUT /test3
{
    "mappings": {
        "doc": {
            "properties": {
                "location": {
                    "type": "geo_shape",
                    "tree": "quadtree",
                    "precision": "100m"
                }
            }
        }
    }
}

我的重新索引脚本(已编辑):

POST _reindex
{

  "size": 1000,
  "source": {

    "index": "test"
    , "query": {
      "constant_score": {
      "filter": {
        "exists": {
          "field": "location"
        }
      }
    }
    }
  },
  "dest": {
    "index": "test3"
  },
  "script":{
    "inline": "if(ctx._source.location.size()>1) {ctx._source.templocation=ctx._source.remove('location'); ctx._source['location.type'] = 'Point';  ctx._source['location.coordinates'] = ctx._source.templocation; ctx._source.remove('templocation'); } "
  }
}

弹性搜索响应:

{
  "took": 172,
  "timed_out": false,
  "total": 2,
  "updated": 0,
  "created": 0,
  "deleted": 0,
  "batches": 1,
  "version_conflicts": 0,
  "noops": 0,
  "retries": {
    "bulk": 0,
    "search": 0
  },
  "throttled_millis": 0,
  "requests_per_second": -1,
  "throttled_until_millis": 0,
  "failures": [
    {
      "index": "test3",
      "type": "data",
      "id": "AWXsdV-z29dKQeP_vT68",
      "cause": {
        "type": "illegal_argument_exception",
        "reason": "[location] is defined as an object in mapping [data] but this name is already used for a field in other types"
      },
      "status": 400
    },
    {
      "index": "test3",
      "type": "data",
      "id": "AWXsdVAP29dKQeP_vT67",
      "cause": {
        "type": "illegal_argument_exception",
        "reason": "[location] is defined as an object in mapping [data] but this name is already used for a field in other types"
      },
      "status": 400
    }
  ]
}

结果为curl -XGET localhost:9200/test3

{
  "test3": {
    "aliases": {},
    "mappings": {
      "doc": {
        "properties": {
          "location": {
            "type": "geo_shape",
            "tree": "quadtree",
            "precision": "100.0m"
          }
        }
      }
    },
    "settings": {
      "index": {
        "creation_date": "1537333568669",
        "number_of_shards": "5",
        "number_of_replicas": "1",
        "uuid": "K78hBgskSkKIg-Itb7uqvA",
        "version": {
          "created": "5060499"
        },
        "provided_name": "test3"
      }
    }
  }
}
4

1 回答 1

0

您的脚本中有错字,应删除一个悬空的右方括号

"inline": "... ctx._source['location.coordinates'] = ctx._source.templocation]; ctx._source.remove('templocation'); } "
                                                                             ^
                                                                             |
                                                                        remove this
于 2018-09-19T04:00:29.030 回答