在 Elasticsearch 中更改映射字段结构流

Changing mapping fields structure flow in Elasticsearch

我有一个映射索引

{
   "mappings": {
      "properties": {
         "title": {
            "type": "text"
         },
         "location": {
            "type": "keyword"
         }
      }
   }
}

目前我们在 location 字段中存储城市名称。 我们需要更改映射结构以存储国家和州,因此映射将是

{
   "mappings": {
      "properties": {
         "title": {
            "type": "text"
         },
         "location": {
            "properties": {
                "country": {
                    "type": "keyword"
                },
                "state": {
                    "type": "keyword"
                },
                "city": {
                    "type": "keyword"
                }
            }
         }
      }
   }
}

此类迁移的推荐流程是什么?

按照以下步骤操作:

  1. Create a new index
  2. Reindex the existing index to populate the new index
  3. Aliases can help cutover from over index to another

Elasticsearch 不允许更改现有字段的映射定义,只能添加新的字段定义,您可以查看 here

所以其中一种可能是:

  • 创建一个新的字段定义,显然具有不同的名称,以存储新的数据类型。

  • 停止使用位置字段

另一种代价高昂的可能性是:

  • 使用正确的映射创建新索引
  • 将旧索引的数据reindex做成新索引

要将具有正确格式的旧索引中的数据重新索引到新索引中,您可以使用 painless script:

POST /_reindex
{
  "source": {
    "index": "old_index_name"
  },
  "dest": {
    "index": "new_index_name"
  },
 "script": {
    "lang": "painless",
     "params" : {
         "location":{
            "country" : null,
             "state": null,
             "city": null
     }
    },
    "source": """
        params.location.city = ctx._source.location
        ctx._source.location = params.location
        
      """
    }
}

之后您可以更新旧数据的国家和州字段。

如果您需要相同的索引名称,请使用您使用正确映射创建的新索引作为备份,然后您需要删除具有旧映射的索引并使用正确的名称重新创建它映射并带入其他储备索引中的数据。

有关更改映射的更多信息,请阅读 CHANGE ELASTIC SEARCH MAPPING