📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

在指定索引上提交异步搜索请求,允许执行长时间运行的复杂查询而不阻塞客户端。

API #

POST /{index}/_async_search

API 的作用 #

该 API 用于在指定索引上提交异步搜索请求。异步搜索可以:

  • 长时间运行而不阻塞客户端
  • 使用返回的任务 ID 来检查搜索状态和获取结果
  • 避免客户端长时间等待复杂查询的完成

限制 #

  • 不支持滚动(scroll)查询
  • 不支持仅建议(suggest-only)查询
  • 主要用于需要长时间运行的复杂查询

API 的参数 #

路由参数 #

参数类型是否必填描述
{index}字符串必需要执行搜索的索引名称

Query String 参数 #

异步搜索特有参数 #

参数类型是否必填默认值描述
wait_for_completion_timeout时间值1s请求应该等待的最小时间才返回部分结果
keep_alive时间值1d结果过期前保持的时间(最小 1 分钟)
keep_on_completion布尔值false在完成或失败时是否保留资源
request_cache布尔值true是否使用请求缓存
batched_reduce_size整数5批量减少操作的文档数量

搜索通用参数 #

参数类型是否必填默认值描述
from整数0分页偏移量
size整数10返回的文档数量
query字符串-Lucene 查询字符串
sort字符串-排序字段,格式为 “field:asc” 或 “field:desc”
explain布尔值false是否返回每个命中文档的评分解释
timeout时间值-等待每个分片返回的超时时间
terminate_after整数-处理完指定数量的文档后终止
track_scores布尔值false是否在返回结果中包含评分
track_total_hits布尔值/整数true是否返回总命中数
stored_fields字符串-要返回的存储字段
docvalue_fields字符串-要返回的 Doc 值字段
preference字符串-分片选择偏好
routing字符串-特定路由值
search_type字符串-搜索执行类型
stats字符串-要收集的统计信息组
max_concurrent_shard_requests整数-并发分片请求数量的最大值
allow_partial_search_results布尔值-是否允许部分分片返回结果
pre_filter_shard_size整数1在每个分片上评估查询的文档数量阈值
ccs_minimize_roundtrips布尔值false最小化跨集群搜索的往返次数

请求体参数 #

请求体必须包含搜索请求的 JSON 格式,包括:

参数类型是否必填描述
query对象搜索查询条件
aggregations对象聚合查询
sort数组排序条件
size整数返回结果数量
from整数起始位置
highlight对象高亮显示
suggest对象搜索建议

示例 #

基本异步搜索 #

POST /my_index/_async_search
{
  "query": {
    "match": {
      "title": "easysearch"
    }
  }
}

响应示例(搜索仍在进行中):

{
  "id": "FmRldE8zSIYPf-3s6EmyOg",
  "is_partial": true,
  "is_running": true,
  "start_time_in_millis": 1641234567890,
  "expiration_time_in_millis": 1641320967890,
  "response": {
    "took": 100,
    "timed_out": false,
    "hits": {
      "total": 10000,
      "hits": [
        {
          "_id": "1",
          "_score": 1.0,
          "_source": {
            "title": "easysearch introduction"
          }
        }
      ]
    }
  }
}

响应示例(搜索已完成):

{
  "id": "FmRldE8zSIYPf-3s6EmyOg",
  "is_partial": false,
  "is_running": false,
  "expiration_time_in_millis": 1641320967890,
  "response": {
    "took": 2500,
    "timed_out": false,
    "hits": {
      "total": 10000,
      "max_score": 1.0,
      "hits": [...]
    }
  }
}

设置等待完成超时 #

POST /my_index/_async_search?wait_for_completion_timeout=5s
{
  "query": {
    "match_all": {}
  }
}

保持结果更长时间 #

POST /my_index/_async_search?keep_alive=2d
{
  "query": {
    "range": {
      "timestamp": {
        "gte": "now-7d"
      }
    }
  },
  "aggs": {
    "by_day": {
      "date_histogram": {
        "field": "timestamp",
        "calendar_interval": "day"
      }
    }
  }
}

完成后保留结果 #

POST /my_index/_async_search?keep_on_completion=true
{
  "query": {
    "bool": {
      "must": [
        { "match": { "title": "search" } },
        { "range": { "created": { "gte": "2026-01-01" } } }
      ]
    }
  }
}

使用聚合 #

POST /sales/_async_search
{
  "size": 0,
  "aggs": {
    "by_category": {
      "terms": {
        "field": "category.keyword"
      },
      "aggs": {
        "total_revenue": {
          "sum": {
            "field": "price"
          }
        }
      }
    }
  }
}

检查异步搜索状态 #

使用返回的任务 ID 检查搜索状态:

GET /_async_search/FmRldE8zSIYPf-3s6EmyOg

获取异步搜索结果 #

GET /_async_search/FmRldE8zSIYPf-3s6EmyOg

删除异步搜索结果 #

DELETE /_async_search/FmRldE8zSIYPf-3s6EmyOg

响应字段说明 #

字段类型描述
id字符串异步搜索任务的唯一标识符
is_partial布尔值结果是否为部分结果
is_running布尔值搜索是否仍在运行中
start_time_in_millis整数搜索开始的时间戳
expiration_time_in_millis整数结果过期的时间戳
response对象搜索结果响应

注意事项 #

  1. 异步搜索结果会占用存储空间,建议使用完成后及时删除
  2. keep_alive 参数设置的结果保留时间会影响存储消耗
  3. 如果只需要确认搜索完成,可以使用较小的 wait_for_completion_timeout
  4. 对于快速查询,建议使用同步搜索 API 而非异步搜索