异步搜索
编辑异步搜索
编辑异步搜索 API 允许您异步执行搜索请求,监控其进度,并在部分结果可用时检索它们。
提交异步搜索 API
编辑异步执行搜索请求。它接受与 搜索 API 相同的参数和请求体。
resp = client.async_search.submit( index="sales*", size="0", sort=[ { "date": { "order": "asc" } } ], aggs={ "sale_date": { "date_histogram": { "field": "date", "calendar_interval": "1d" } } }, ) print(resp)
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
const response = await client.asyncSearch.submit({ index: "sales*", size: 0, sort: [ { date: { order: "asc", }, }, ], aggs: { sale_date: { date_histogram: { field: "date", calendar_interval: "1d", }, }, }, }); console.log(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 密钥。
resp = client.async_search.get( id="FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=", ) print(resp)
response = client.async_search.get( id: 'FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=' ) puts response
const response = await client.asyncSearch.get({ id: "FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=", }); console.log(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" : [] } } } }
当查询不再运行时,指示搜索是失败还是在所有分片上成功完成。当查询正在执行时, |
|
指示搜索仍在执行还是已完成 |
|
异步搜索何时过期 |
|
当异步搜索完成时,会指示 completion_time (start_time + took) |
|
指示已执行的结果缩减次数。如果此数字与上次检索的结果相比增加,您可以预期搜索响应中会包含其他结果 |
|
指示有多少分片已执行查询。请注意,为了将分片结果包含在搜索响应中,需要先对其进行缩减。 |
|
来自已完成查询执行的分片的部分聚合结果。 |
在调用“获取异步搜索 API”时,还可以提供 wait_for_completion_timeout
参数,以便等待搜索完成,直到达到提供的超时时间。如果在超时时间到期之前可用,则将返回最终结果,否则,将在超时时间到期后返回当前可用的结果。默认情况下,不设置超时,这意味着将返回当前可用的结果,而无需任何额外的等待。
keep_alive
参数指定异步搜索应在集群中保持可用的时间。如果未指定,则将使用通过相应的提交异步请求设置的 keep_alive
。否则,可以覆盖该值并延长请求的有效性。当此期限到期时,如果搜索仍在运行,则会取消该搜索。如果搜索已完成,则会删除其保存的结果。
获取异步搜索状态
编辑获取异步搜索状态 API,无需检索搜索结果,仅显示给定 id
的先前提交的异步搜索请求的状态。
如果启用了 Elasticsearch 安全功能,则对特定异步搜索状态的访问仅限于
- 提交原始异步搜索请求的用户或 API 密钥。
- 具有
monitor
集群特权或更高级别的用户。
您还可以通过 keep_alive
参数指定异步搜索需要保持可用的时间,该参数默认为 5d
(五天)。在此期间之后,正在进行的异步搜索和任何已保存的搜索结果将被删除。
resp = client.async_search.status( id="FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=", ) print(resp)
response = client.async_search.status( id: 'FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=' ) puts response
const response = await client.asyncSearch.status({ id: "FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=", }); console.log(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 手动删除异步搜索。如果搜索仍在运行,则将取消搜索请求。否则,将删除保存的搜索结果。
resp = client.async_search.delete( id="FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=", ) print(resp)
response = client.async_search.delete( id: 'FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=' ) puts response
const response = await client.asyncSearch.delete({ id: "FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=", }); console.log(response);
DELETE /_async_search/FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=
如果启用了 Elasticsearch 安全功能,则对特定异步搜索的删除仅限于
- 提交原始异步搜索请求的用户或 API 密钥。
- 具有
cancel_task
集群特权或更高级别的用户。