作者:acChristina | 来源:互联网 | 2024-12-12 14:19
在Elasticsearch中,映射(mappings)定义了索引中字段的结构,类似于传统数据库中的表结构。虽然Elasticsearch支持字段的增删,但直接修改字段类型是不允许的。本文介绍了一种通过创建新索引并迁移数据的方式来改变字段类型的方法。
在Elasticsearch中,映射(mappings)的作用类似于数据库中的表结构设计,允许在使用过程中添加或移除字段。但是,Elasticsearch并不支持直接修改现有字段的数据类型。为了应对这种需求,可以通过创建一个新的索引,并将原有索引的数据迁移到新索引中,同时更新字段类型来间接实现这一目标。以下是具体步骤:
- 创建一个具有所需字段类型的新索引。
- 使用_reindex API将原始索引的数据迁移到新索引。
- 安全地删除原始索引。
- 为新索引设置一个与原索引相同的别名,以便无缝切换。
下面以一个具体的例子来说明这个过程:
假设我们有一个名为my-index-order-1的索引,包含两个字段:
- createTime:订单创建时间,类型为long
- orderNo:订单编号,类型为text
现在需要将createTime字段的类型从long改为date。
PUT /my-index-order-1?pretty
{
"mappings": {
"properties": {
"createTime": {
"type": "long"
},
"orderNo": {
"type": "text"
}
}
}
}
向该索引中插入几条示例数据:
PUT /my-index-order-1/_doc/1?pretty
{
"createTime": 1637992973517,
"orderNo": "7d7d5495-4db9-4513-a2c9-c5fb0454517e"
}
PUT /my-index-order-1/_doc/2?pretty
{
"createTime": 1637993092000,
"orderNo": "fb337ede-6e1d-4422-8e2b-453148064bba"
}
PUT /my-index-order-1/_doc/3?pretty
{
"createTime": 1640585092000,
"orderNo": "54ccb3a9-c168-487e-8594-893a2b7803bf"
}
步骤 1: 创建新索引
PUT /my-index-order-2?pretty
{
"mappings": {
"properties": {
"createTime": {
"type": "date"
},
"orderNo": {
"type": "text"
}
}
}
}
步骤 2: 数据迁移
_reindex API用于在两个索引间复制数据。如果两个索引的映射不同,只有兼容的数据会被复制。对于大量数据的迁移,_reindex请求可能会超时,但这不影响后台继续处理。可以使用GET _tasks?detailed=true&actiOns=*reindex
查看任务状态,或者用GET _tasks/taskId:number
查询特定任务的详细信息。
POST _reindex
{
"source": {
"index": "my-index-order-1"
},
"dest": {
"index": "my-index-order-2"
}
}
步骤 3: 删除旧索引
确认新索引已成功接收所有数据后,可以安全地删除旧索引。
DELETE /my-index-order-1/
步骤 4: 设置别名
为新索引设置与旧索引相同的别名,确保应用程序可以继续使用原来的索引名称进行操作。
POST _aliases
{
"actions":[
{
"add":{
"index":"my-index-order-2",
"alias":"my-index-order-1"
}
}
]
}
完成上述步骤后,就可以对新的日期字段执行时间相关的聚合查询了。例如,统计每月的订单数量:
GET /my-index-order-2/_search?pretty
{
"size": 0,
"aggs": {
"orderCount": {
"date_histogram": {
"field": "createTime",
"calendar_interval": "1M",
"format": "yyyy-MM"
}
}
}
}
查询结果示例:
{
"took": 27,
"timed_out": false,
"_shards": {
...
},
"hits": {
...
},
"aggregations": {
"orderCount": {
"buckets": [
{
"key_as_string": "2021-11",
"key": 1635724800000,
"doc_count": 2
},
{
"key_as_string": "2021-12",
"key": 1638316800000,
"doc_count": 1
}
]
}
}
}
本示例基于Elasticsearch版本7.15.2和Kibana版本7.15.2。更多关于Elasticsearch的信息,请访问官方文档:Elastic官网。