如何在Elasticsearch中改变字段类型?

2,220 阅读3分钟

使用_映射API,你可以更新现有字段或向现有索引添加新字段。

注意:要对一个索引进行修改,确保你在目标索引上有管理权限。

基本用法

要修改一个字段类型,向_mapping API发送一个PUT请求,然后是请求正文。请求体包括目标字段的属性参数和映射。当创建一个新的字段时,确保你包括字段名、类型和映射参数。

例如,下面的请求将字段类型从整数改为长。

PUT /my-index/_mapping
{
"properties": {
"base_price": {
"type": "long"
  }
  }
}

成功完成后,你应该看到一个输出为。

{
  "acknowledged" :true
}

重新索引的方法

在大多数情况下,Elasticsearch会阻止你更新现有索引的字段类型。这样做可能会导致目前的数据变得无效,并在索引中引起错误。

如果你仍然想更新现有字段的类型,你可以通过几个简单的步骤来完成。

  1. 用正确的映射信息创建一个新的索引,其中的字段类型被改变为你所需要的类型。
  2. 将数据从你的旧索引重新索引到新索引。
  3. 删除旧的索引

使用这种方法可以使你减少你的索引的最小停机时间。

创建一个旧的索引

让我们从创建一个具有不正确字段类型的索引开始。

PUT /change-me
{
"mappings": {
"properties": {
"id": {
"type": "integer"
      },
"username": {
"type": "text"
  }
    }
  }
}

在上面的例子中,我们有一个简单的索引,有两个字段:id和username。字段类型分别是整数和文本。

让我们假设该字段包含如下查询中所示的数据。

POST /change-me/_doc

{
"id": 1000,
"username": "root"
}
POST /change-me/_doc
{
"id": 1001,
"username": "other"
}

上面的两个查询将用请求正文中提供的数据创建一个文件。

确保数据的存在。

GET /change-me/_search?pretty
{
"query": {
"match_all": {}
  }
}

我们应该看到如图所示的两条记录。

创建一个新的索引

假设我们想把id字段从一个整数改为一个关键字。我们将首先创建一个新的索引,其类型为关键字。

PUT /change-me-reindex
{
"mappings": {
"properties": {
"id": {
"type": "keyword"
      },
"username": {
"type": "text"
  }
    }
  }
}

在上面的请求中,我们创建了一个新的索引,并将id类型设置为一个关键字。

重新索引旧的数据

下一步是使用_ re-index API将旧索引中的数据重新索引到新索引中。这方面的请求如下。

POST /_reindex
{
"source": {
"index": "change-me"
  },
"dest": {
"index": "change-me-reindex"
  }
}

上述请求将把文件从旧的索引复制到新的索引,其中字段类型从整数变为关键字。

上述查询的输出结果:

{
  "took" : 8,
  "timed_out" : false,
  "total" : 4,
  "updated" : 0,
  "created" : 4,
  "deleted" : 0,
  "batches" : 1,
  "version_conflicts" : 0,
  "noops" : 0,
  "retries" : {
    "bulk" : 0,
    "search" : 0
  },
  "throttled_millis" : 0,
  "requests_per_second" : -1.0,
  "throttled_until_millis" : 0,
  "failures" : [ ]
}

删除旧的索引

现在我们有了一个具有正确映射的更新的索引,现在是时候删除旧的索引了。我们可以通过向该索引发送一个DELETE请求来做到这一点。

DELETE /change-me

在成功删除后,你应该看到一个输出为:

{
  "acknowledged" :true
}

创建索引别名

如果你有使用旧索引的应用程序,它们可能会停止工作,因为它已经不存在了。

我们可以通过用旧索引的名字为新索引创建一个别名来解决这个问题。

PUT /change-me-reindex/_alias/change-me

上面的请求应该为新索引创建一个别名。

总结

在本指南中,你发现了如何改变Elasticsearch索引中一个现有字段的类型。