异步搜索
> 文档中心 > 文档中心 > INFINI Easysearch > 功能手册 > 搜索操作 > 异步搜索

异步搜索 #

搜索大量数据可能会花费很长时间,尤其是当你在热节点或者多个远程集群中进行搜索时。

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_completiontruekeep_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 集群设置添加了若干设置项。这些设置是动态的,因此您无需重启集群即可更改插件的默认行为。

您可以将这些设置标记为persistenttransient

例如,要更新结果索引的保留期限:

PUT _cluster/settings
{
  "transient": {
    "async_search.max_wait_for_completion_timeout": "5m"
  }
}
设置默认值描述
async_search.max_search_running_time12 hours搜索的最长运行时间,超过该时间后搜索将被终止。
async_search.node_concurrent_running_searches20每个协调节点同时运行的搜索数量。
async_search.max_keep_alive5 days搜索结果在集群中存储的最长时间。
async_search.max_wait_for_completion_timeout1 minutewait_for_completion_timeout 参数的最大值。
async_search.persist_search_failuresfalse将以搜索失败结束的异步搜索结果持久化到系统索引中。