在很多的时候,由于一些需求,我们不得不修改索引的映射,也即 mapping,这个时候我们需要重新索引(reindex)来把之前的数据索引到新的索引中。槽糕的是,我们的这个索引还在不断地收集实时数据,那么我们该如何处理这种情况呢?
比如,我们有这样的一个案例。假设你有一个名为 production_logs 的索引处于活动状态,这意味着它不断接收新数据。现在假设你想要以需要重新索(reindex)引该索引的所有数据的方式更新其映射:通常,当你想要更改现有字段的数据类型(例如从keyword 到 integer)时,会发生这种情况。
好的,现在你拥有的选项将取决于你首先如何设置索引。
你需要一个 index template
如果你没有自己创建索引,Elasticsearch 能够创建索引,这意味着如果你尝试索引 foo 索引中的某些数据,Elasticsearch 将创建它(如果它尚不存在)。
通过这样做,它使用称为动态映射的功能为这个新索引创建默认映射。
这就是你需要索引模板的原因! 此功能允许你定义 Elasticsearch 自动创建的索引将获得的所有属性,包括其设置和映射。
因此,如果你的 production_logs 索引没有索引模板,仍然是时候创建它了。 我们称它为 production_logs_template 并将此模板的模式设置为 production_logs* ,这意味着每次 Elasticearch 将自动创建名称与模式 production_logs* 匹配的索引时,它将应用该模板(请参阅完整文档)。
以下是索引模板创建请求的示例:
代码语言:txt复制PUT _index_template/production_logs_template
{
"index_patterns": [ "production_logs*"],
"template": {
"settings": {
...
},
"mappings": {
...
}
}
}
案例 1:你已经有一个 index alias
将真实索引隐藏在索引别名后面始终是一个好习惯。
它引入的抽象级别可帮助你在后台执行修改,而不会影响索引的用户(无论是人还是软件)。
因此,假设你获得了当前链接到要修改的 production_logs 索引的日志别名,并且你想要根据 production_logs_template 更新索引的映射。
这里的方法很简单:
更新索引模板以定义新映射
创建一个新索引,其名称与 production_logs* 匹配(例如 production_logs_1 ),切换日志别名以指向这个新索引
代码语言:txt复制POST _aliases
{
"actions": [
{
"add": {
"index": "production_logs_1",
"alias": "logs"
}
},
{
"remove": {
"index": "production_logs",
"alias": "logs"
}
}
]
}
在上面我们的 add 及 remove 是一个原子操作,也即同时起作用。中间不会有其它的操作,这样保证在删除的同时,向我们的索引别名 logs 写入的数据能够正确地写入到新的索引中。
将数据从 production_logs 重新索引到 production_logs_1
代码语言:txt复制POST _reindex?wait_for_completion=false
{
"source": {
"index": "production_logs"
},
"dest": {
"index": "production_logs_1"
}
}
此请求将返回一个 task_id,你可以使用它来监视重建索引过程的进度。
以下是你收到的响应示例:
代码语言:txt复制{
"task": "<task_id>"
}
你可以发出请求以利用任务管理 API:
代码语言:txt复制GET _tasks/<task_id>?human
上述命令可以让我们知道任务的进度。就是这么简单! 在重建索引过程结束时,你的 production_logs_1 索引将包含所有新旧数据,并具有正确的映射。