异步搜索
搜索大量数据可能需要很长时间,尤其是在跨温节点或多个远程集群进行搜索时。
UDB-SX 中的异步搜索允许您发送在后台运行的搜索请求。您可以监控这些搜索的进度,并在部分结果可用时获取它们。搜索完成后,您可以保存结果以便稍后检查。
REST API
要执行异步搜索,请向 _plugins/_asynchronous_search 发送请求,并将查询放在请求体中:
POST _plugins/_asynchronous_search
您可以指定以下选项。
| 选项 | 描述 | 默认值 | 必需 |
|---|---|---|---|
wait_for_completion_timeout |
您计划等待结果的时长。在此期间,您可以像普通搜索一样查看已获得的任何结果。您可以根据 ID 轮询剩余结果。最大值为 300 秒。 | 1 秒 | 否 |
keep_on_completion |
搜索完成后是否将结果保存在集群中。您可以稍后检查存储的结果。 | false |
否 |
keep_alive |
结果保存在集群中的时长。例如,2d 表示结果在集群中存储 48 小时。保存的搜索结果在此期限后或搜索被取消时会被删除。注意,这包括查询执行时间。如果查询超时,进程将自动取消此查询。 |
12 小时 | 否 |
index |
要搜索的索引名称。可以是单个名称、逗号分隔的索引列表或索引名的通配符表达式。 | 集群中的所有索引 | 否 |
示例请求
POST _plugins/_asynchronous_search/?pretty&size=10&wait_for_completion_timeout=1ms&keep_on_completion=true&request_cache=false
{
"aggs": {
"city": {
"terms": {
"field": "city",
"size": 10
}
}
}
}
示例响应
{
"*id*": "FklfVlU4eFdIUTh1Q1hyM3ZnT19fUVEUd29KLWZYUUI3TzRpdU5wMjRYOHgAAAAAAAAABg==",
"state": "RUNNING",
"start_time_in_millis": 1599833301297,
"expiration_time_in_millis": 1600265301297,
"response": {
"took": 15,
"timed_out": false,
"terminated_early": false,
"num_reduce_phases": 4,
"_shards": {
"total": 21,
"successful": 4,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 807,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"city": {
"doc_count_error_upper_bound": 16,
"sum_other_doc_count": 403,
"buckets": [
{
"key": "downsville",
"doc_count": 1
},
....
....
....
{
"key": "blairstown",
"doc_count": 1
}
]
}
}
}
}
响应参数
| 选项 | 描述 |
|---|---|
id |
异步搜索的 ID。使用此 ID 监控搜索进度、获取部分结果和/或删除结果。如果异步搜索在超时期限内完成,响应中不包含 ID,因为结果未存储在集群中。 |
state |
指定搜索是否仍在运行或已完成,以及结果是否持久保存在集群中。可能的状态有 RUNNING、SUCCEEDED、FAILED、PERSISTING、PERSIST_SUCCEEDED、PERSIST_FAILED、CLOSED 和 STORE_RESIDENT。 |
start_time_in_millis |
开始时间(毫秒)。 |
expiration_time_in_millis |
过期时间(毫秒)。 |
took |
搜索运行的总时间。 |
response |
实际的搜索响应。 |
num_reduce_phases |
协调节点从分片响应批次聚合结果的次数(默认为 5 次)。如果此数字与上次检索到的结果相比有所增加,您可以预期搜索响应中将包含更多结果。 |
total |
运行搜索的分片总数。 |
successful |
协调节点成功接收到的分片响应数。 |
aggregations |
到目前为止分片已完成的部分聚合结果。 |
获取部分结果
提交异步搜索请求后,您可以使用异步搜索响应中看到的 ID 请求部分响应。
GET _plugins/_asynchronous_search/<ID>?pretty
示例响应
{
"id": "Fk9lQk5aWHJIUUltR2xGWnpVcWtFdVEURUN1SWZYUUJBVkFVMEJCTUlZUUoAAAAAAAAAAg==",
"state": "STORE_RESIDENT",
"start_time_in_millis": 1599833907465,
"expiration_time_in_millis": 1600265907465,
"response": {
"took": 83,
"timed_out": false,
"_shards": {
"total": 20,
"successful": 20,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1000,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "bank",
"_id": "1",
"_score": 1,
"_source": {
"email": "amberduke@abc.com",
"city": "Brogan",
"state": "IL"
}
},
{....}
]
},
"aggregations": {
"city": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 997,
"buckets": [
{
"key": "belvoir",
"doc_count": 2
},
{
"key": "aberdeen",
"doc_count": 1
},
{
"key": "abiquiu",
"doc_count": 1
}
]
}
}
}
}
响应成功持久化后,您将在响应中收到 STORE_RESIDENT 状态。
您可以使用 wait_for_completion_timeout 参数轮询 ID,等待在指定时间内接收到的结果。
对于 keep_on_completion 为 true 且 keep_alive 时间足够长的异步搜索,您可以持续轮询 ID 直到搜索完成。如果您不希望定期轮询每个 ID,可以使用 keep_alive 参数将结果保留在集群中,稍后再返回查看。
删除搜索和结果
要删除异步搜索:
DELETE _plugins/_asynchronous_search/<ID>?pretty
如果搜索仍在运行,UDB-SX 会取消它。
如果搜索已完成,UDB-SX 会删除保存的结果。
示例响应
{
"acknowledged": "true"
}
监控统计信息
您可以使用统计信息 API 操作监控正在运行、已完成和/或已持久化的异步搜索。
GET _plugins/_asynchronous_search/stats
示例响应
{
"_nodes": {
"total": 8,
"successful": 8,
"failed": 0
},
"cluster_name": "264071961897:asynchronous-search",
"nodes": {
"JKEFl6pdRC-xNkKQauy7Yg": {
"asynchronous_search_stats": {
"submitted": 18236,
"initialized": 112,
"search_failed": 56,
"search_completed": 56,
"rejected": 18124,
"persist_failed": 0,
"cancelled": 1,
"running_current": 399,
"persisted": 100
}
}
}
}
响应参数
| 选项 | 描述 |
|---|---|
submitted |
已提交的异步搜索请求数。 |
initialized |
已初始化的异步搜索请求数。 |
rejected |
被拒绝的异步搜索请求数。 |
search_completed |
成功完成响应的异步搜索请求数。 |
search_failed |
响应失败的异步搜索请求数。 |
persisted |
最终结果成功持久化到集群中的异步搜索请求数。 |
persist_failed |
最终结果未能持久化到集群中的异步搜索请求数。 |
running_current |
在给定协调节点上运行的异步搜索请求数。 |
cancelled |
在搜索运行时被取消的异步搜索请求数。 |