异步搜索
搜索大量数据可能需要很长时间,特别是当您跨热节点或多个远程集群进行搜索时。
OpenSearch 中的异步搜索允许您发送在后台运行的搜索请求。您可以监控这些搜索的进度,并在部分结果可用时获取它们。搜索完成后,您可以保存结果以便稍后查看。
REST API
1.0 版引入
要执行异步搜索,请向 _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 | 到目前为止分片已完成的部分聚合结果。 |
获取部分结果
1.0 版引入
提交异步搜索请求后,您可以使用在异步搜索响应中看到的 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
参数将结果保留在集群中,并在以后再查看。
删除搜索和结果
1.0 版引入
要删除异步搜索
DELETE _plugins/_asynchronous_search/<ID>?pretty
- 如果搜索仍在运行,OpenSearch 将取消它。
- 如果搜索已完成,OpenSearch 将删除保存的结果。
示例响应
{
"acknowledged": "true"
}
监控统计数据
1.0 版引入
您可以使用 stats 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
}
}
}
}
响应参数
选项 | 描述 |
---|---|
已提交 | 已提交的异步搜索请求数量。 |
已初始化 | 已初始化的异步搜索请求数量。 |
已拒绝 | 已拒绝的异步搜索请求数量。 |
search_completed | 成功响应完成的异步搜索请求数量。 |
search_failed | 失败响应完成的异步搜索请求数量。 |
已持久化 | 最终结果成功持久化到集群的异步搜索请求数量。 |
持久化失败 | 最终结果未能持久化到集群的异步搜索请求数量。 |
running_current | 在给定协调节点上运行的异步搜索请求数量。 |
已取消 | 搜索运行时被取消的异步搜索请求数量。 |