异步搜索 #
搜索大量数据可能会花费很长时间,尤其是当你在热节点或者多个远程集群中进行搜索时。
Easysearch 中的异步搜索允许你发送在后台运行的搜索请求。你可以监控这些搜索的进度,并且在部分结果可用时获取这些部分结果。在搜索完成之后,你可以保存结果以便日后查看。
先决条件 #
要运行 异步搜索 搜索,必须安装 async_search 插件,参考 插件安装 。
REST API #
引入版本 1.11.0
要执行异步搜索,请向 /{index}/_async_search 发送请求,并在请求正文中包含您的查询:
POST test-index/_asynch_search
可以指定以下选项。
选项 | 描述 | 默认值 | 是否必填 |
---|---|---|---|
wait_for_completion_timeout | 计划等待结果的时间。在此时间内,您可以像在普通搜索中一样查看所获得的结果。您可以根据ID轮询剩余的结果。最大值为300秒。 | 1秒 | 否 |
keep_on_completion | 搜索完成后,您是否希望将结果保存在集群中。您可以在稍后查看存储的结果。 | false | 否 |
keep_alive | 结果在集群中保存的时间。例如,2d 表示结果在集群中存储48小时。保存的搜索结果在此时间段结束后或如果搜索被取消时将被删除。请注意,这包括查询执行时间。如果查询超过此时间,进程将自动取消该查询。 | 12小时 | 否 |
index | 要搜索的索引名称。可以是单个名称、用逗号分隔的索引列表,或索引名称的通配符表达式。 | 集群中的所有索引 | 否 |
请求示例 #
POST test-index/_async_search?wait_for_completion_timeout=1ms&keep_on_completion=true
{
"query": {
"match": {
"name": "张三"
}
}
}
示例响应 #
{
"id": "FmFqN0llTXlKVHF5cnV1NGdVNUlPancEMzMzMBRaOUNxU3BVQlRIdzczZmJfNnZtRQIyMA==",
"state": "RUNNING",
"start_time_in_millis": 1740714470020,
"expiration_time_in_millis": 1740800870020,
"response": {
"took": 0,
"timed_out": false,
"num_reduce_phases": 0,
"_shards": {
"total": 1,
"successful": 0,
"skipped": 0,
"failed": 0
},
"hits": {
"max_score": null,
"hits": []
}
}
}
响应参数 #
选项 | 描述 |
---|---|
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 _async_search/<ID>
示例响应 #
{
"id": "FmFqN0llTXlKVHF5cnV1NGdVNUlPancEMzMzMBRaOUNxU3BVQlRIdzczZmJfNnZtRQIyMA==",
"state": "STORE_RESIDENT",
"start_time_in_millis": 1740714470020,
"expiration_time_in_millis": 1740800870020,
"response": {
"took": 4,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.3862942,
"hits": [
{
"_index": "test-index",
"_type": "_doc",
"_id": "7MFOQZUBDkJmGmNvda2z",
"_score": 1.3862942,
"_source": {
"date": "2025-01-15",
"score": 89.5,
"name": "张三",
"age": 25
}
}
]
}
}
}
在响应成功持久化之后,你会在响应中得到 STORE_RESIDENT
状态。
你可以使用 wait_for_completion_timeout
参数轮询该ID,以等待在你指定的时间内接收到的结果。
对于 keep_on_completion
为 true
且 keep_alive
时间足够长的异步搜索,你可以持续轮询这些ID,直到搜索结束。如果你不想定期轮询每个ID,你可以使用 keep_alive
参数将结果保留在你的集群中,然后在稍后时间回来查看。
删除搜索及其结果 #
要删除一个异步搜索:
DELETE _async_search/<ID>
- 如果搜索仍在进行中,Easysearch 会取消该搜索。
- 如果搜索已完成,Easysearch 会删除已保存的结果。
示例响应 #
{
"acknowledged": "true"
}
监控统计信息 #
您可以使用统计信息API操作来监控正在运行、已完成、或已持久化的异步搜索。
GET _async_search/stats
示例响应 #
{
"_nodes": {
"total": 1,
"successful": 1,
"failed": 0
},
"cluster_name": "easysearch",
"nodes": {
"aj7IeMyJTqyruu4gU5IOjw": {
"asynchronous_search_stats": {
"submitted": 21,
"initialized": 21,
"running_current": 0,
"persisted": 20,
"search_failed": 1,
"search_completed": 20,
"rejected": 0,
"persist_failed": 0,
"cancelled": 0
}
}
}
}
响应参数 #
选项 | 描述 |
---|---|
submitted | 已提交的异步搜索请求数量。 |
initialized | 已初始化的异步搜索请求数量。 |
rejected | 已拒绝的异步搜索请求数量。 |
search_completed | 成功响应完成的异步搜索请求数量。 |
search_failed | 失败响应完成的异步搜索请求数量。 |
persisted | 最终结果成功持久化到集群中的异步搜索请求数量。 |
persist_failed | 最终结果未能持久化到集群中的异步搜索请求数量。 |
running_current | 在指定协调节点上运行的异步搜索请求数量。 |
cancelled | 在搜索运行期间被取消的异步搜索请求数量。 |
异步搜索设置 #
异步搜索插件为 Easysearch 集群设置添加了若干设置项。这些设置是动态的,因此您无需重启集群即可更改插件的默认行为。
您可以将这些设置标记为persistent
或transient
。
例如,要更新结果索引的保留期限:
PUT _cluster/settings
{
"transient": {
"async_search.max_wait_for_completion_timeout": "5m"
}
}
设置 | 默认值 | 描述 |
---|---|---|
async_search.max_search_running_time | 12 hours | 搜索的最长运行时间,超过该时间后搜索将被终止。 |
async_search.node_concurrent_running_searches | 20 | 每个协调节点同时运行的搜索数量。 |
async_search.max_keep_alive | 5 days | 搜索结果在集群中存储的最长时间。 |
async_search.max_wait_for_completion_timeout | 1 minute | wait_for_completion_timeout 参数的最大值。 |
async_search.persist_search_failures | false | 将以搜索失败结束的异步搜索结果持久化到系统索引中。 |