异步搜索
异步搜索 API 允许异步执行搜索请求,监视其进度,并在部分结果可用时检索它们。
提交异步搜索 API
异步执行搜索请求。它接受与搜索 API 相同的参数和请求体。
POST /sales*/_async_search?size=0
{
"sort": [
{ "date": { "order": "asc" } }
],
"aggs": {
"sale_date": {
"date_histogram": {
"field": "date",
"calendar_interval": "1d"
}
}
}
}
响应包含正在执行的搜索的标识符。你可以使用此 ID 稍后检索搜索的最终结果。当前可用的搜索结果将作为响应对象的一部分返回。
{
"id" : "FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=",
"is_partial" : true,
"is_running" : true,
"start_time_in_millis" : 1583945890986,
"expiration_time_in_millis" : 1584377890986,
"response" : {
"took" : 1122,
"timed_out" : false,
"num_reduce_phases" : 0,
"_shards" : {
"total" : 562,
"successful" : 3,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 157483,
"relation" : "gte"
},
"max_score" : null,
"hits" : [ ]
}
}
}
"id" : "FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc="
:异步搜索的标识符,可用于监视其进度、检索其结果和/或删除它"is_partial" : true
: 当查询不再运行时,指示在所有分片上搜索是失败还是成功完成。执行查询时,is_partial
始终设置为true
"is_running" : true
:搜索是否仍在执行或已完成"total" : 562
:总共有多少个分片将被执行搜索"successful" : 3
:有多少分片成功完成了搜索"value" : 157483
:当前有多少文档与查询匹配,这些文档属于已完成搜索的分片
虽然查询不再运行,因此 is_running
设置为 false
,但结果可能是部分的。如果某些分片返回结果后搜索失败,或者协调异步搜索的节点死亡,就会发生这种情况。
通过提供 wait_for_completion_timeout
参数(默认为 1
秒),可以阻止并等待搜索完成,直到达到某个超时。当异步搜索在这样的超时内完成时,响应将不包括ID,因为结果不存储在集群中。keep_on_completion
参数(默认为 false
)可以设置为 true
,以请求存储结果,以便在 wait_for_completion_timeout
内搜索完成时,也可以进行后续检索。
你还可以通过 keep_alive
参数指定异步搜索需要多长时间可用,该参数默认为 5d
(五天)。在此期间之后,将删除正在进行的异步搜索和任何保存的搜索结果。
当结果的主要排序是索引字段时,分片将根据其为该字段保留的最小值和最大值进行排序,因此部分结果将根据请求的排序标准可用。
提交异步搜索 API 支持与搜索 API 相同的[参数]((/rest_apis/search_apis/search#查询参数),尽管有些参数具有不同的默认值:
batched_reduce_size
默认为5
:这会影响部分结果可用的频率,这会在碎片结果减少时发生。每次协调节点收到一定数量的新碎片响应(默认情况下为5
)时,都会执行部分减少。request_cache
默认为true
pre_filter_shard_size
默认为1
且不能被修改:这是为了强制执行预筛选往返,以从每个切分中检索统计信息,从而跳过那些肯定不包含任何与查询匹配的文档的切分。ccs_minimize_roundtrips
默认为false
,且是唯一支持的值。
默认情况下,7.x 版本 Elasticsearch 不会限制存储的异步搜索响应的大小。存储大量异步响应可能会破坏集群的稳定性。如果要设置最大允许大小的限制,请更改搜 search.max_async_search_response_size
集群级设置。之后,尝试存储大于此设置的异步响应将导致错误。
获取异步搜索
获取异步搜索 API 根据之前提交的异步搜索请求的 id 检索其结果。如果启用了 Elasticsearch 安全功能,则对特定异步搜索结果的访问仅限于提交该请求的用户或 API 密钥。
GET /_async_search/FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=
{
"id" : "FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=",
"is_partial" : true,
"is_running" : true,
"start_time_in_millis" : 1583945890986,
"expiration_time_in_millis" : 1584377890986,
"response" : {
"took" : 12144,
"timed_out" : false,
"num_reduce_phases" : 46,
"_shards" : {
"total" : 562,
"successful" : 188,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 456433,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"sale_date" : {
"buckets" : []
}
}
}
}
"is_partial" : true
:当查询不再运行时,指示在所有分片上搜索是失败还是成功完成。执行查询时,is_partial
始终设置为true
"is_running" : true
:搜索是否仍在执行或已完成"expiration_time_in_millis" : 1584377890986
:异步搜索将在何时过期"num_reduce_phases" : 46
:表示已执行了多少次结果缩减。如果与上次检索的结果相比,这个数字增加了,那么你可以期望搜索响应中包含更多的结果"successful" : 188
:指示已执行查询的分片数。请注意,为了将碎片结果包含在搜索响应中,需要首先减少分片结果。"aggregations"
:部分聚合结果,来自已完成查询执行的分片。
调用获取异步搜索 API 时,还可以提供 wait_for_completion_timeout
参数,以便在提供的超时之前等待搜索完成。如果在超时过期之前可用,将返回最终结果,否则在超时过期后将返回当前可用的结果。默认情况下,未设置超时,这意味着将返回当前可用的结果,而无需任何额外等待。
keep_alive
参数指定异步搜索在集群中的可用时间。未指定时,将使用带有相应提交异步请求的 keep_alive
集。否则,可以覆盖该值并扩展请求的有效性。此期限到期后,如果搜索仍在运行,将取消搜索。如果搜索完成,其保存的结果将被删除。
获取异步搜索状态
获取异步搜索状态 API 不检索搜索结果,只显示之前提交的异步搜索请求的状态(给定其 id
)。如果启用了 Elasticsearch 安全功能,则对获取异步搜索状态 API 的访问仅限于监视用户(monitoring_user)角色。
GET /_async_search/status/FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=
{
"id" : "FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=",
"is_running" : true,
"is_partial" : true,
"start_time_in_millis" : 1583945890986,
"expiration_time_in_millis" : 1584377890986,
"_shards" : {
"total" : 562,
"successful" : 188,
"skipped" : 0,
"failed" : 0
}
}
"successful" : 188
:指示到目前为止已执行查询的分片数。
对于已完成的异步搜索,状态响应有一个额外的 completion_status
字段,显示已完成异步搜索的状态代码。
{
"id" : "FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=",
"is_running" : false,
"is_partial" : false,
"start_time_in_millis" : 1583945890986,
"expiration_time_in_millis" : 1584377890986,
"_shards" : {
"total" : 562,
"successful" : 562,
"skipped" : 0,
"failed" : 0
},
"completion_status" : 200
}
"completion_status" : 200
:指示异步搜索已成功完成。
{
"id" : "FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=",
"is_running" : false,
"is_partial" : true,
"start_time_in_millis" : 1583945890986,
"expiration_time_in_millis" : 1584377890986,
"_shards" : {
"total" : 562,
"successful" : 450,
"skipped" : 0,
"failed" : 112
},
"completion_status" : 503
}
"completion_status" : 503
:指示异步搜索已完成,但出现错误。
删除异步搜索
你可以使用删除异步搜索 API 按 ID 手动删除异步搜索。如果搜索仍在运行,搜索请求将被取消。否则,保存的搜索结果将被删除。
DELETE /_async_search/FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=
如果启用了 Elasticsearch 安全功能,则特定异步搜索的删除仅限于:*
, 提交原始搜索请求的经过身份验证的用户。*
具有 cancel_task
集群权限的用户。