假设我有一个长时间运行的更新查询,我正在更新〜200k到500k,甚至更多。为什么我需要更新这么多文档超出了问题的范围。
由于客户端超时(我使用官方的ES python客户端),我想有办法检查批量更新请求的状态,而不必使用巨大的超时值。
对于简短请求,可以使用请求的响应,是否有一种方法可以获得请求的响应,或者我是否可以指定name
或id
到请求以便稍后参考。
对于正在运行的请求:我可以使用tasks API
来获取信息。
但是对于其他状态 - 已完成/失败,我该如何获得。
如果我尝试访问已完成的任务,我会收到resource not found
。
P.S。我使用update_by_query
进行更新
答案 0 :(得分:1)
With the task id you can look up the task directly:
GET /_tasks/taskId:1
这个API的优点是它集成了 wait_for_completion = false以透明方式返回状态 完成任务。如果任务完成并且 wait_for_completion = false已设置在它们上面它会带回来 结果或错误字段。此功能的成本是文档 wait_for_completion = false在.tasks / task / $ {taskId}创建。它是 由你来删除该文件。
我的用例是这样的,我需要做一个update_by_query,我使用无痛的脚本语言。起初我做了一个reindex(测试时)。然后我尝试使用update_by_query
功能(它们彼此非常相似)。我对任务api做了一个请求(操作当然没有完成),我看到了正在执行的任务。完成后我做了一个查询,我操作的字段的数据已经消失了。该脚本工作,因为我使用相同的脚本为reindex api,一切都按照应有的方式进行。由于时间不够,我没有进一步调查,但是......是的,彻底测试......
答案 1 :(得分:0)
我觉得GET /_tasks/taskId:1
容易理解。它应该是
GET http://localhost:9200/_tasks/taskId
taskId看起来像这样NCvmGYS-RsW2X8JxEYumgA:1204320
。
以下是与此主题相关的简单解释。
要检查任务,您需要知道其taskId。
任务ID是由node_id,冒号和task_sequence_number组成的字符串。一个例子是taskId = NCvmGYS-RsW2X8JxEYumgA:1204320
,node_id = NCvmGYS-RsW2X8JxEYumgA
和task_sequence_number = 1204320
。包括我在内的一些人认为taskId = 1204320
,但这不是弹性搜索代码库开发人员此刻理解它的方式。
可以通过两种方式找到taskId。
wait_for_deletion = false
。使用此参数向ES发送请求时,响应将为{"task" : "NCvmGYS-RsW2X8JxEYumgA:1204320"}
。然后,您可以像GET http://localhost:9200/_tasks/NCvmGYS-RsW2X8JxEYumgA:1204320
GET http://localhost:9200/_tasks?detailed=false&actions=*/delete/byquery
。此示例将使用action = delete_by_query返回所有任务的状态。如果您知道ES上只运行一个任务,您可以从所有正在运行的任务的响应中找到您的taskId。在您了解taskId之后,您可以使用此功能获取任务的状态。
GET /_tasks/taskId
请注意,您只能在任务运行时检查任务的状态,或者使用wait_for_deletion == false
生成任务。
更简单的解释,wait_for_deletion
默认为true
。根据我的理解,wait_for_deletion = true
的任务是"在记忆中"只要。您仍然可以在任务运行时检查其状态。但它在完成/取消后完全消失了。检查状态的含义将返回“resouce_not_found_exception”' resouce_not_found_exception'。 wait_for_deletion = false
的任务将存储在ES系统索引.task
中。完成后您仍然可以查看它的状态。但是,您可能希望在完成后从.task
索引中删除此任务文档以节省一些空间。删除请求看起来像这样
http://localhost:9200/.tasks/task/NCvmGYS-RsW2X8JxEYumgA:1204320
如果没有taskId,您将收到resouce_not_found_exception
。 (例如,您删除了一些任务两次,或者您正在删除其内容wait_for_deletetion == true
的内存中任务。
关于这个令人困惑的任务我做了一个拉取请求https://github.com/elastic/elasticsearch/pull/31122来帮助澄清Elasticsearch文档。不幸的是,他们拒绝了。啊。