异步搜索编辑

异步搜索 API 允许您异步执行搜索请求,监控其进度,并在结果可用时检索部分结果。

提交异步搜索 API编辑

异步执行搜索请求。它接受与 搜索 API 相同的参数和请求主体。

response = client.async_search.submit(
  index: 'sales*',
  size: 0,
  body: {
    sort: [
      {
        date: {
          order: 'asc'
        }
      }
    ],
    aggregations: {
      sale_date: {
        date_histogram: {
          field: 'date',
          calendar_interval: '1d'
        }
      }
    }
  }
)
puts response
POST /sales*/_async_search?size=0
{
  "sort": [
    { "date": { "order": "asc" } }
  ],
  "aggs": {
    "sale_date": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "1d"
      }
    }
  }
}

响应包含正在执行的搜索的标识符。您可以使用此 ID 稍后检索搜索的最终结果。当前可用的搜索结果作为 response 对象的一部分返回。

{
  "id" : "FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=", 
  "is_partial" : true, 
  "is_running" : true, 
  "start_time_in_millis" : 1583945890986,
  "expiration_time_in_millis" : 1584377890986,
  "response" : {
    "took" : 1122,
    "timed_out" : false,
    "num_reduce_phases" : 0,
    "_shards" : {
      "total" : 562, 
      "successful" : 3, 
      "skipped" : 0,
      "failed" : 0
    },
    "hits" : {
      "total" : {
        "value" : 157483, 
        "relation" : "gte"
      },
      "max_score" : null,
      "hits" : [ ]
    }
  }
}

可用于监控其进度、检索其结果和/或删除它的异步搜索的标识符

当查询不再运行时,指示搜索是否失败或在所有分片上成功完成。在执行查询时,is_partial 始终设置为 true

搜索是否仍在执行或已完成

搜索将在其上执行的总分片数

已成功完成搜索的分片数

当前与查询匹配的文档数,这些文档属于已完成搜索的分片

虽然查询不再运行,因此 is_running 设置为 false,但结果可能是部分的。如果搜索在某些分片返回其结果后失败,或者协调异步搜索的节点死亡,就会发生这种情况。

可以通过提供 wait_for_completion_timeout 参数(默认值为 1 秒)来阻塞并等待搜索完成,直到达到某个超时时间。如果异步搜索在该超时时间内完成,则响应将不包含 ID,因为结果不会存储在集群中。默认值为 falsekeep_on_completion 参数可以设置为 true,以请求在搜索在 wait_for_completion_timeout 内完成时也存储结果以供以后检索。

您还可以通过 keep_alive 参数指定异步搜索需要在集群中可用的时间,该参数默认值为 5d(五天)。正在进行的异步搜索和任何保存的搜索结果将在此期限后删除。

当结果的主要排序是索引字段时,分片会根据它们对该字段持有的最小值和最大值进行排序,因此部分结果将按照请求的排序标准变得可用。

提交异步搜索 API 支持与搜索 API 相同的 参数,尽管有些参数的默认值不同

  • batched_reduce_size 默认值为 5:这会影响部分结果变得可用的频率,这会在每次减少分片结果时发生。每当协调节点收到一定数量的新分片响应(默认值为 5)时,就会执行部分减少。
  • request_cache 默认值为 true
  • pre_filter_shard_size 默认值为 1 且不可更改:这是为了强制执行预筛选往返以从每个分片检索统计信息,以便肯定不包含与查询匹配的任何文档的分片被跳过。
  • ccs_minimize_roundtrips 默认值为 false。在进行跨集群搜索时,将其设置为 true 可能会提高整体搜索延迟,尤其是在搜索具有大量分片的集群时。但是,当设置为 true 时,直到所有集群上的搜索完成,才会收到远程集群上搜索的进度。有关更多信息,请参阅 跨集群搜索

异步搜索不支持 滚动 也不支持仅包含 建议部分 的搜索请求。

默认情况下,Elasticsearch 不允许存储大于 10Mb 的异步搜索响应,尝试这样做会导致错误。可以通过更改 search.max_async_search_response_size 集群级设置来设置存储的异步搜索响应的最大允许大小。

获取异步搜索编辑

获取异步搜索 API 根据其 ID 检索先前提交的异步搜索请求的结果。

如果启用了 Elasticsearch 安全功能,则访问特定异步搜索的结果将仅限于 提交它的用户或 API 密钥

response = client.async_search.get(
  id: 'FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc='
)
puts response
GET /_async_search/FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=
{
  "id" : "FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=",
  "is_partial" : false, 
  "is_running" : false, 
  "start_time_in_millis" : 1583945890986,
  "expiration_time_in_millis" : 1584377890986, 
  "completion_time_in_millis" : 1583945903130, 
  "response" : {
    "took" : 12144,
    "timed_out" : false,
    "num_reduce_phases" : 46, 
    "_shards" : {
      "total" : 562,
      "successful" : 188, 
      "skipped" : 0,
      "failed" : 0
    },
    "hits" : {
      "total" : {
        "value" : 456433,
        "relation" : "eq"
      },
      "max_score" : null,
      "hits" : [ ]
    },
    "aggregations" : { 
      "sale_date" :  {
        "buckets" : []
      }
    }
  }
}

当查询不再运行时,指示搜索是否失败或在所有分片上成功完成。在执行查询时,is_partial 始终设置为 true

搜索是否仍在执行或已完成

异步搜索将过期的时间

当异步搜索完成时,将指示完成时间(开始时间 + 耗时)

指示已执行多少次结果减少。如果此数字与上次检索的结果相比有所增加,则您预计搜索响应中将包含更多结果

指示已执行查询的分片数。请注意,为了将分片结果包含在搜索响应中,它们需要先被减少。

部分聚合结果,来自已完成查询执行的分片。

在调用获取异步搜索 API 时,也可以提供 wait_for_completion_timeout 参数,以等待搜索完成,直到提供的超时时间。如果在超时时间到期之前可用,则将返回最终结果,否则,一旦超时时间到期,将返回当前可用的结果。默认情况下,不会设置任何超时时间,这意味着将返回当前可用的结果,而无需任何额外等待。

keep_alive 参数指定异步搜索应该在集群中可用的时间。如果未指定,将使用与相应的提交异步请求一起设置的 keep_alive。否则,可以覆盖此值并延长请求的有效期。当此期限到期时,如果搜索仍在运行,则会取消搜索。如果搜索已完成,则会删除其保存的结果。

获取异步搜索状态编辑

获取异步搜索状态 API 不会检索搜索结果,仅显示先前提交的异步搜索请求的状态,该请求由其 id 指定。

如果启用了 Elasticsearch 安全功能,则访问特定异步搜索的状态将仅限于

  • 提交 原始异步搜索请求的用户或 API 密钥。
  • 具有 monitor 集群权限或更高权限的用户。

您还可以通过 keep_alive 参数指定异步搜索需要在集群中可用的时间,该参数默认值为 5d(五天)。正在进行的异步搜索和任何保存的搜索结果将在此期限后删除。

response = client.async_search.status(
  id: 'FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc='
)
puts response
GET /_async_search/status/FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=
{
  "id" : "FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=",
  "is_running" : true,
  "is_partial" : true,
  "start_time_in_millis" : 1583945890986,
  "expiration_time_in_millis" : 1584377890986,
  "_shards" : {
      "total" : 562,
      "successful" : 188, 
      "skipped" : 0,
      "failed" : 0
  }
}

指示到目前为止已执行查询的分片数。

对于已完成的异步搜索,状态响应将具有一个额外的 completion_status 字段,该字段显示已完成的异步搜索的状态代码。

{
  "id" : "FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=",
  "is_running" : false,
  "is_partial" : false,
  "start_time_in_millis" : 1583945890986,
  "expiration_time_in_millis" : 1584377890986,
  "_shards" : {
      "total" : 562,
      "successful" : 562,
      "skipped" : 0,
      "failed" : 0
  },
 "completion_status" : 200 
}

指示异步搜索已成功完成。

{
  "id" : "FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=",
  "is_running" : false,
  "is_partial" : true,
  "start_time_in_millis" : 1583945890986,
  "expiration_time_in_millis" : 1584377890986,
  "_shards" : {
      "total" : 562,
      "successful" : 450,
      "skipped" : 0,
      "failed" : 112
  },
 "completion_status" : 503 
}

指示异步搜索已完成,但出现错误。

删除异步搜索编辑

您可以使用删除异步搜索 API 通过 ID 手动删除异步搜索。如果搜索仍在运行,则会取消搜索请求。否则,将删除保存的搜索结果。

response = client.async_search.delete(
  id: 'FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc='
)
puts response
DELETE /_async_search/FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=

如果启用了 Elasticsearch 安全功能,则删除特定异步搜索将仅限于

  • 提交 原始异步搜索请求的用户或 API 密钥。
  • 具有 cancel_task 集群权限或更高权限的用户。