多搜索 API编辑

使用单个 API 请求执行多个搜索。

response = client.msearch(
  index: 'my-index-000001',
  body: [
    {},
    {
      query: {
        match: {
          message: 'this is a test'
        }
      }
    },
    {
      index: 'my-index-000002'
    },
    {
      query: {
        match_all: {}
      }
    }
  ]
)
puts response
GET my-index-000001/_msearch
{ }
{"query" : {"match" : { "message": "this is a test"}}}
{"index": "my-index-000002"}
{"query" : {"match_all" : {}}}

请求编辑

GET /<target>/_msearch

先决条件编辑

  • 如果启用了 Elasticsearch 安全功能,则您必须对目标数据流、索引或别名具有 read 索引权限。有关跨集群搜索的信息,请参阅远程集群

描述编辑

多搜索 API 从单个 API 请求执行多个搜索。请求的格式类似于批量 API 格式,并使用换行符分隔的 JSON (NDJSON) 格式。

结构如下

header\n
body\n
header\n
body\n

如果特定搜索最终重定向到另一个节点,则此结构经过专门优化以减少解析。

数据的最后一行必须以换行符 \n 结尾。每个换行符前面可以有一个回车符 \r。向此端点发送请求时,Content-Type 标头应设置为 application/x-ndjson

路径参数编辑

<target>

(可选,字符串)要搜索的数据流、索引和别名的逗号分隔列表。

如果请求正文中的搜索未指定 index 目标,则此列表充当回退。

支持通配符 (*) 表达式。要搜索集群中的所有数据流和索引,请省略此参数或使用 _all*

查询参数编辑

allow_no_indices
(可选,布尔值)如果为 false,则如果任何通配符表达式、索引别名_all 值仅定位到缺少或关闭的索引,则请求将返回错误。即使请求定位到其他打开的索引,此行为也适用。例如,如果索引以 foo 开头但没有索引以 bar 开头,则定位到 foo*,bar* 的请求将返回错误。
ccs_minimize_roundtrips
(可选,布尔值)如果为 true,则对于跨集群搜索请求,将最大程度地减少协调节点与远程集群之间的网络往返次数。默认为 true。请参阅跨集群搜索如何处理网络延迟
expand_wildcards

(可选,字符串)通配符模式可以匹配的索引类型。如果请求可以定位到数据流,则此参数确定通配符表达式是否匹配隐藏数据流。支持逗号分隔的值,例如 open,hidden。有效值为

all
匹配任何数据流或索引,包括隐藏的数据流或索引。
open
匹配打开的、非隐藏的索引。也匹配任何非隐藏的数据流。
closed
匹配关闭的、非隐藏的索引。也匹配任何非隐藏的数据流。数据流不能关闭。
hidden
匹配隐藏的数据流和隐藏的索引。必须与 openclosed 或两者结合使用。
none
不接受通配符模式。

默认为 open

ignore_throttled

(可选,布尔值)如果为 true,则在冻结时将忽略具体的、扩展的或别名索引。默认为 true

[7.16.0] 已弃用于 7.16.0。

ignore_unavailable
(可选,布尔值)如果为 false,则如果请求定位到缺少或关闭的索引,则请求将返回错误。默认为 false
max_concurrent_searches
(可选,整数)多搜索 API 可以执行的最大并发搜索数。默认为 max(1, (# of 数据节点 * min(搜索线程池大小, 10)))
max_concurrent_shard_requests

(可选,整数)每个子搜索请求在每个节点上执行的最大并发分片请求数。默认为 5

您可以使用此参数来防止请求使集群过载。例如,默认请求会命中集群中的所有数据流和索引。如果每个节点的分片数很多,这可能会导致分片请求被拒绝。

在某些情况下,并行性不是通过并发请求实现的。在这些情况下,此参数中的值较低可能会导致性能不佳。例如,在预期并发搜索请求数量非常少的情况下,此参数中的值较高可能会提高性能。

pre_filter_shard_size

(可选,整数)定义一个阈值,如果搜索请求扩展到的分片数超过该阈值,则强制执行预过滤往返,以根据查询重写预过滤搜索分片。如果例如分片无法根据其重写方法匹配任何文档(例如,如果日期过滤器是匹配的强制性条件,但分片边界和查询是不相交的),则此过滤器往返可以显着限制分片数。如果未指定,则在满足以下任何条件时执行预过滤阶段

  • 请求定位到超过 128 个分片。
  • 请求定位到一个或多个只读索引。
  • 查询的主排序定位到索引字段。
rest_total_hits_as_int
(可选,布尔值)如果为 true,则在响应中以整数形式返回 hits.total。默认为 false,这将返回一个对象。
routing
(可选,字符串)用于将搜索操作路由到特定分片的自定义路由值
search_type

(可选,字符串)指示在对返回的文档进行评分时是否应使用全局词条和文档频率。

选项为

query_then_fetch
(默认)使用分片的本地词条和文档频率对文档进行评分。这通常更快,但准确性较低。
dfs_query_then_fetch
使用所有分片中的全局词条和文档频率对文档进行评分。这通常较慢,但准确性较高。
typed_keys
(可选,布尔值)指定在响应中是否应在其各自类型的聚合和建议器名称前添加前缀。

请求正文编辑

请求正文包含以换行符分隔的搜索 <header> 和搜索 <body> 对象列表。

<header>

(必需,对象)用于限制或更改搜索的参数。

每个搜索正文都需要此对象,但可以为空 ({}) 或空行。

<header> 对象的属性
allow_no_indices

(可选,布尔值)如果为 true,则如果通配符表达式或 _all 值仅检索到缺少或关闭的索引,则请求**不会**返回错误。

此参数也适用于指向缺少或索引的别名

expand_wildcards

(可选,字符串)通配符模式可以匹配的索引类型。如果请求可以定位到数据流,则此参数确定通配符表达式是否匹配隐藏数据流。支持逗号分隔的值,例如 open,hidden。有效值为

all
匹配任何数据流或索引,包括隐藏的数据流或索引。
open
匹配打开的、非隐藏的索引。也匹配任何非隐藏的数据流。
closed
匹配关闭的、非隐藏的索引。也匹配任何非隐藏的数据流。数据流不能关闭。
hidden
匹配隐藏的数据流和隐藏的索引。必须与 openclosed 或两者结合使用。
none
不接受通配符模式。

默认为 open

ignore_unavailable
(可选,布尔值)如果为 true,则来自缺少或关闭的索引的文档不包含在响应中。默认为 false
index

(可选,字符串或字符串数组)要搜索的数据流、索引和别名。支持通配符 (*)。将多个目标指定为数组。

如果未指定此参数,则 <target> 请求路径参数将用作回退。

preference
(可选,字符串)用于执行搜索的节点或分片。默认为随机。
request_cache
(可选,布尔值)如果为 true,则可以使用请求缓存进行此搜索。默认为索引级设置。请参阅分片请求缓存设置
routing
(可选,字符串)用于将搜索操作路由到特定分片的自定义路由值
search_type

(可选,字符串)指示在对返回的文档进行评分时是否应使用全局词条和文档频率。

选项为

query_then_fetch
(默认)使用分片的本地词条和文档频率对文档进行评分。这通常更快,但准确性较低。
dfs_query_then_fetch
使用所有分片中的全局词条和文档频率对文档进行评分。这通常较慢,但准确性较高。
<body>

(可选,对象)包含搜索请求的参数

<body> 对象的属性
aggregations
(可选,聚合对象)您希望在搜索期间运行的聚合。请参阅聚合
query
(可选,查询 DSL 对象)您希望在搜索期间运行的查询。匹配此查询的结果将在响应中返回。
from
(可选,整数)返回结果的起始偏移量。默认为 0
size
(可选,整数)要返回的结果数。默认为 10

响应正文编辑

responses
(数组)包括每个搜索请求的搜索响应和状态代码,与其在原始多搜索请求中的顺序相匹配。如果特定搜索请求完全失败,则将在实际搜索响应的位置返回一个包含 error 消息和相应状态代码的对象。

示例编辑

标头包含要搜索的数据流、索引和别名。标头还指示 search_typepreferencerouting。正文包含典型的搜索正文请求(包括 queryaggregationsfromsize 等等)。

$ cat requests
{"index" : "test"}
{"query" : {"match_all" : {}}, "from" : 0, "size" : 10}
{"index" : "test", "search_type" : "dfs_query_then_fetch"}
{"query" : {"match_all" : {}}}
{}
{"query" : {"match_all" : {}}}

{"query" : {"match_all" : {}}}
{"search_type" : "dfs_query_then_fetch"}
{"query" : {"match_all" : {}}}
$ curl -H "Content-Type: application/x-ndjson" -XGET localhost:9200/_msearch --data-binary "@requests"; echo

请注意,以上示例包含一个空标头(也可以是不包含任何内容),这也是支持的。

该端点还允许您在请求路径中针对数据流、索引和别名进行搜索。在这种情况下,它将用作默认目标,除非在标头的 index 参数中明确指定。例如

response = client.msearch(
  index: 'my-index-000001',
  body: [
    {},
    {
      query: {
        match_all: {}
      },
      from: 0,
      size: 10
    },
    {},
    {
      query: {
        match_all: {}
      }
    },
    {
      index: 'my-index-000002'
    },
    {
      query: {
        match_all: {}
      }
    }
  ]
)
puts response
GET my-index-000001/_msearch
{}
{"query" : {"match_all" : {}}, "from" : 0, "size" : 10}
{}
{"query" : {"match_all" : {}}}
{"index" : "my-index-000002"}
{"query" : {"match_all" : {}}}

以上示例将针对所有未在请求正文中定义 index 目标的请求,对 my-index-000001 索引执行搜索。最后一次搜索将针对 my-index-000002 索引执行。

可以以类似的方式设置 search_type,以全局应用于所有搜索请求。

部分响应编辑

为了确保快速响应,如果一个或多个分片失败,多重搜索 API 将返回部分结果。有关更多信息,请参阅分片故障

搜索取消编辑

可以使用标准的任务取消机制取消多重搜索,并且当用于执行请求的 HTTP 连接被客户端关闭时,也会自动取消。至关重要的是,发送请求的 HTTP 客户端在请求超时或中止时关闭连接。取消多重搜索请求也会取消所有相应的子搜索请求。