如何在不停止服务的情况下更改 elasticsearch 上的字段类型?

How can I change fields type on elasticsearch without stop my services?

这两天在google里搜索,在www.elastic.co里找资料,但我还是觉得puzzled.Here是我的实际情况:

我终于学习并设置了ELK服务month.I通过logstash导入我的日志到elasticsearch

但是我在制作可视化图表时遇到了问题,我需要对一个字段求​​和才能做到这一点,但我得到了错误:

this field type is string,need number to sum! 

需要一个数字来计算总和,这是有道理的,所以我尝试将字段类型从字符串更改为数字(长)。

我做到了,这是我的解决方案:

  1. post elasticsearch 和创建新索引的模板
  2. 将 logstash 输出设置为新索引并重新启动它
  3. 将旧索引重新索引到新索引
  4. 删除旧索引

这是我的问题:

我可以跳过第二步吗?

我不想重启logstash,因为它是实时接收数据的,我不想让它遗漏一些数据。

如果我不重新启动 logstash,我无法将输出更改为新索引。

搞得我一头雾水

字段类型一旦设置,便无法更改。

根据 official guide:

Although you can add to an existing mapping, you can’t change existing field mappings. If a mapping already exists for a field, data from that field has probably been indexed. If you were to change the field mapping, the indexed data would be wrong and would not be properly searchable.

所以您唯一的选择是重新索引整个索引。 好消息是,零停机是可能的。该过程已解释 here。它是通过使用别名创建的,索引发生了变化,但两者都指向相同的别名,我猜包括 Logstash,在这种情况下你不需要重新启动它。

无论如何,如果可能的话,最好事先为每个字段设置正确的类型映射。如果你事先不知道它们,也许可以做一个更准确的模板。即使停机时间为零,重新索引整个索引也可能会有点慢,具体取决于索引大小。