异步搜索
编辑异步搜索编辑
异步搜索 API 允许您异步执行搜索请求,监控其进度,并在结果可用时检索部分结果。
提交异步搜索 API编辑
异步执行搜索请求。它接受与 搜索 API 相同的参数和请求主体。
response = client.async_search.submit( index: 'sales*', size: 0, body: { sort: [ { date: { order: 'asc' } } ], aggregations: { sale_date: { date_histogram: { field: 'date', calendar_interval: '1d' } } } } ) puts response
POST /sales*/_async_search?size=0 { "sort": [ { "date": { "order": "asc" } } ], "aggs": { "sale_date": { "date_histogram": { "field": "date", "calendar_interval": "1d" } } } }
响应包含正在执行的搜索的标识符。您可以使用此 ID 稍后检索搜索的最终结果。当前可用的搜索结果作为 response
对象的一部分返回。
{ "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" : [ ] } } }
可用于监控其进度、检索其结果和/或删除它的异步搜索的标识符 |
|
当查询不再运行时,指示搜索是否失败或在所有分片上成功完成。在执行查询时, |
|
搜索是否仍在执行或已完成 |
|
搜索将在其上执行的总分片数 |
|
已成功完成搜索的分片数 |
|
当前与查询匹配的文档数,这些文档属于已完成搜索的分片 |
虽然查询不再运行,因此 is_running
设置为 false
,但结果可能是部分的。如果搜索在某些分片返回其结果后失败,或者协调异步搜索的节点死亡,就会发生这种情况。
可以通过提供 wait_for_completion_timeout
参数(默认值为 1
秒)来阻塞并等待搜索完成,直到达到某个超时时间。如果异步搜索在该超时时间内完成,则响应将不包含 ID,因为结果不会存储在集群中。默认值为 false
的 keep_on_completion
参数可以设置为 true
,以请求在搜索在 wait_for_completion_timeout
内完成时也存储结果以供以后检索。
您还可以通过 keep_alive
参数指定异步搜索需要在集群中可用的时间,该参数默认值为 5d
(五天)。正在进行的异步搜索和任何保存的搜索结果将在此期限后删除。
当结果的主要排序是索引字段时,分片会根据它们对该字段持有的最小值和最大值进行排序,因此部分结果将按照请求的排序标准变得可用。
提交异步搜索 API 支持与搜索 API 相同的 参数,尽管有些参数的默认值不同
-
batched_reduce_size
默认值为5
:这会影响部分结果变得可用的频率,这会在每次减少分片结果时发生。每当协调节点收到一定数量的新分片响应(默认值为5
)时,就会执行部分减少。 -
request_cache
默认值为true
-
pre_filter_shard_size
默认值为1
且不可更改:这是为了强制执行预筛选往返以从每个分片检索统计信息,以便肯定不包含与查询匹配的任何文档的分片被跳过。 -
ccs_minimize_roundtrips
默认值为false
。在进行跨集群搜索时,将其设置为true
可能会提高整体搜索延迟,尤其是在搜索具有大量分片的集群时。但是,当设置为true
时,直到所有集群上的搜索完成,才会收到远程集群上搜索的进度。有关更多信息,请参阅 跨集群搜索。
默认情况下,Elasticsearch 不允许存储大于 10Mb 的异步搜索响应,尝试这样做会导致错误。可以通过更改 search.max_async_search_response_size
集群级设置来设置存储的异步搜索响应的最大允许大小。
获取异步搜索编辑
获取异步搜索 API 根据其 ID 检索先前提交的异步搜索请求的结果。
如果启用了 Elasticsearch 安全功能,则访问特定异步搜索的结果将仅限于 提交它的用户或 API 密钥。
response = client.async_search.get( id: 'FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=' ) puts response
GET /_async_search/FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=
{ "id" : "FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=", "is_partial" : false, "is_running" : false, "start_time_in_millis" : 1583945890986, "expiration_time_in_millis" : 1584377890986, "completion_time_in_millis" : 1583945903130, "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" : [] } } } }
当查询不再运行时,指示搜索是否失败或在所有分片上成功完成。在执行查询时, |
|
搜索是否仍在执行或已完成 |
|
异步搜索将过期的时间 |
|
当异步搜索完成时,将指示完成时间(开始时间 + 耗时) |
|
指示已执行多少次结果减少。如果此数字与上次检索的结果相比有所增加,则您预计搜索响应中将包含更多结果 |
|
指示已执行查询的分片数。请注意,为了将分片结果包含在搜索响应中,它们需要先被减少。 |
|
部分聚合结果,来自已完成查询执行的分片。 |
在调用获取异步搜索 API 时,也可以提供 wait_for_completion_timeout
参数,以等待搜索完成,直到提供的超时时间。如果在超时时间到期之前可用,则将返回最终结果,否则,一旦超时时间到期,将返回当前可用的结果。默认情况下,不会设置任何超时时间,这意味着将返回当前可用的结果,而无需任何额外等待。
keep_alive
参数指定异步搜索应该在集群中可用的时间。如果未指定,将使用与相应的提交异步请求一起设置的 keep_alive
。否则,可以覆盖此值并延长请求的有效期。当此期限到期时,如果搜索仍在运行,则会取消搜索。如果搜索已完成,则会删除其保存的结果。
获取异步搜索状态编辑
获取异步搜索状态 API 不会检索搜索结果,仅显示先前提交的异步搜索请求的状态,该请求由其 id
指定。
如果启用了 Elasticsearch 安全功能,则访问特定异步搜索的状态将仅限于
- 提交 原始异步搜索请求的用户或 API 密钥。
- 具有
monitor
集群权限或更高权限的用户。
您还可以通过 keep_alive
参数指定异步搜索需要在集群中可用的时间,该参数默认值为 5d
(五天)。正在进行的异步搜索和任何保存的搜索结果将在此期限后删除。
response = client.async_search.status( id: 'FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=' ) puts response
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 } }
对于已完成的异步搜索,状态响应将具有一个额外的 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 }
{ "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 }
删除异步搜索编辑
您可以使用删除异步搜索 API 通过 ID 手动删除异步搜索。如果搜索仍在运行,则会取消搜索请求。否则,将删除保存的搜索结果。
response = client.async_search.delete( id: 'FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=' ) puts response
DELETE /_async_search/FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=
如果启用了 Elasticsearch 安全功能,则删除特定异步搜索将仅限于
- 提交 原始异步搜索请求的用户或 API 密钥。
- 具有
cancel_task
集群权限或更高权限的用户。