如何使用其他字段中的值向现有映射添加字段?

时间:2017-03-30 19:11:55

标签: elasticsearch

当前映射字段是

      ...
      "latitude": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      ...

我想添加一个字段' location'在纬度和纬度使用这些数据经度场。我该如何实施?

    "location": {
      "type": "geo_point"
    }
  }

1 个答案:

答案 0 :(得分:2)

目前,无法为现有索引中的新字段添加和填充数据。

您可以通过reindexing数据将其实现到新索引中的唯一方法。

假设您有一个索引(source-index test-geo-index ,其中包含两个字段(不限于两个字段以便于理解,我只使用了2个字段)latitudelongitude如下所示:

PUT test-geo-index
{
  "mappings": {
    "test-geo-type": {
      "properties": {
        "longitute": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "latitude": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        }
      }
    }
  }
}

现在,您可以使用上述映射和位置字段创建新索引(dest-index test-geo-updated-index ,并将数据填充到其中使用 elasticsearch _reindex API

PUT test-geo-updated-index
{
  "mappings": {
    "test-geo-type": {
      "properties": {
        "longitute": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "latitude": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "location": {
          "type": "geo_point"
        }
      }
    }
  }
}

Elasticsearch ReIndex API:

POST _reindex
{
  "source": {
    "index": "test-geo-index"
  },
  "dest": {
    "index": "test-geo-updated-index"
  },
  "script": {
    "inline": "ctx._source.location=ctx._source.latitude + \",\" + ctx._source.longitude"
  }
}

您可以阅读有关Reindex API here

的更多信息