我正在使用AWS Elasticsearch服务(版本6.3)。我对在将数据从current_index
重新索引到new_index
时更改映射感兴趣。我不是要从旧的Elasticsearch集群升级到新集群。我的current_index
和new_index
都在同一个Elasticsearch 6.3集群上。
我要遵循Elastic documentation的信息,尝试执行就地重新索引操作
我的索引包含大约25万个可搜索文档。当我POST _reindex
使用curl请求时,
curl -X POST "aws_elasticsearch_endpoint/_reindex" -H 'Content-Type: application/json' -d'
{
"source": {
"index": "current_index"
},
"dest": {
"index": "new_index"
}
}
'
Elasticsearch开始重新索引过程(我通过执行GET /_cat/indices?v
来验证此过程),最终遇到curl: (56) Unexpected EOF
错误。 Reindex操作实际上可以正常工作。大约2小时后,doc.count
中的new_index
与current_index
相匹配,并且status
变成green
如果我来自Java POST _reindex
,则会收到此错误:
java.net.SocketException: Unexpected end of file from server
仅当索引中的文档大小较小(我尝试使用可搜索1k的文档)时,Reindex API才能成功返回指定的here
答案 0 :(得分:1)
这是因为响应需要很长时间才能返回,并且卷曲时间超时。在小型数据集上,响应会在超时之前返回,因此您为什么会得到响应。
但是,当curl超时时,重新索引仍在进行中,您仍然可以使用以下命令查看重新索引的执行情况:
GET _tasks?actions=*reindex&detailed=true
您还可以做的是在curl命令中添加...?wait_for_completion=false
。 ES将为您的重新索引操作创建一个后台任务。 curl命令将提前终止并返回一个taskId
,然后您可以使用它Task API
GET .tasks/task/<taskId>
还要注意,在这种情况下,完成任务后,您还需要从.tasks
索引中删除任务,ES不会为您完成。
答案 1 :(得分:1)
AWS Elasticsearch ELB(弹性负载平衡器)的超时时间为60秒。目前无法配置,这是一个长期存在的功能要求
您可以在此aws forum thread
因此,任何操作(在这种情况下重新建立索引的时间超过60秒)都会导致网关超时。
因此,不可能通过增加客户端超时来阻止长时间运行的重新索引。
对于reindex API,解决方法如上述@Val所建议。
那就是使用wait_for_completion=false
标志和Reindex API文档链接中提到的步骤:
https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-reindex.html#_url_parameters_3