多重搜索 API
编辑多重搜索 API
编辑使用单个 API 请求执行多个搜索。
resp = client.msearch( index="my-index-000001", searches=[ {}, { "query": { "match": { "message": "this is a test" } } }, { "index": "my-index-000002" }, { "query": { "match_all": {} } } ], ) print(resp)
response = client.msearch( index: 'my-index-000001', body: [ {}, { query: { match: { message: 'this is a test' } } }, { index: 'my-index-000002' }, { query: { match_all: {} } } ] ) puts response
const response = await client.msearch({ index: "my-index-000001", searches: [ {}, { query: { match: { message: "this is a test", }, }, }, { index: "my-index-000002", }, { query: { match_all: {}, }, }, ], }); console.log(response);
GET my-index-000001/_msearch { } {"query" : {"match" : { "message": "this is a test"}}} {"index": "my-index-000002"} {"query" : {"match_all" : {}}}
请求
编辑GET /<目标>/_msearch
描述
编辑多重搜索 API 从单个 API 请求执行多个搜索。请求的格式类似于批量 API 格式,并使用换行符分隔的 JSON (NDJSON) 格式。
结构如下:
header\n body\n header\n body\n
此结构经过专门优化,以减少特定搜索最终被重定向到另一个节点时的解析。
最后一行数据必须以换行符 \n
结尾。每个换行符前面可以跟一个回车符 \r
。向此端点发送请求时,Content-Type
标头应设置为 application/x-ndjson
。
路径参数
编辑-
<目标>
-
(可选,字符串)要搜索的数据流、索引和别名的逗号分隔列表。
如果请求正文中的搜索未指定
index
目标,则此列表充当回退。支持通配符 (
*
) 表达式。要搜索集群中的所有数据流和索引,请省略此参数或使用_all
或*
。
查询参数
编辑-
allow_no_indices
- (可选,布尔值)如果为
false
,则当任何通配符表达式、索引别名或_all
值仅以缺失或关闭的索引为目标时,请求将返回错误。即使请求以其他打开的索引为目标,此行为也适用。例如,如果某个索引以foo
开头,但没有索引以bar
开头,则以foo*,bar*
为目标的请求将返回错误。 -
ccs_minimize_roundtrips
- (可选,布尔值)如果为
true
,则会为跨集群搜索请求最大程度减少协调节点和远程集群之间的网络往返。默认为true
。请参阅 跨集群搜索如何处理网络延迟。 -
expand_wildcards
-
(可选,字符串)通配符模式可以匹配的索引类型。如果请求可以以数据流为目标,则此参数确定通配符表达式是否匹配隐藏的数据流。支持逗号分隔的值,例如
open,hidden
。有效值为:-
all
- 匹配任何数据流或索引,包括隐藏的那些。
-
open
- 匹配打开的、非隐藏的索引。也匹配任何非隐藏的数据流。
-
closed
- 匹配关闭的、非隐藏的索引。也匹配任何非隐藏的数据流。数据流无法关闭。
-
hidden
- 匹配隐藏的数据流和隐藏的索引。必须与
open
、closed
或两者结合使用。 -
none
- 不接受通配符模式。
默认为
open
。 -
-
ignore_throttled
-
(可选,布尔值)如果为
true
,则在冻结时会忽略具体的、展开的或别名的索引。默认为true
。[7.16.0] 在 7.16.0 中已弃用。
-
ignore_unavailable
- (可选,布尔值)如果为
false
,则当请求以缺失或关闭的索引为目标时,请求将返回错误。默认为false
。 -
max_concurrent_searches
- (可选,整数)多重搜索 API 可以执行的最大并发搜索数。默认为
max(1, ( 数据节点的数量 * 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
- 匹配隐藏的数据流和隐藏的索引。必须与
open
、closed
或两者结合使用。 -
none
- 不接受通配符模式。
默认为
open
。 -
-
ignore_unavailable
- (可选,布尔值)如果为
true
,则响应中不包含来自缺失或关闭索引的文档。默认为false
。 -
index
-
(可选,字符串或字符串数组)要搜索的数据流、索引和别名。支持通配符 (
*
)。将多个目标指定为数组。如果未指定此参数,则使用
<目标>
请求路径参数作为回退。 -
preference
- (可选,字符串)用于执行搜索的节点或分片。默认为随机。
-
request_cache
- (可选,布尔值)如果为
true
,则可以将请求缓存用于此搜索。默认为索引级设置。请参阅 分片请求缓存设置。 -
routing
- (可选,字符串)用于将搜索操作路由到特定分片的自定义 路由值。
-
search_type
-
(可选,字符串)指示在对返回的文档进行评分时,是否应使用全局术语和文档频率。
选项为:
-
query_then_fetch
- (默认)文档使用该分片的本地术语和文档频率进行评分。这通常更快,但准确性较低。
-
dfs_query_then_fetch
- 文档使用所有分片中的全局术语和文档频率进行评分。这通常较慢,但准确性较高。
-
-
-
<body>
-
(可选,对象)包含搜索请求的参数
响应正文
编辑-
responses
- (数组)包括每个搜索请求的搜索响应和状态代码,与原始多重搜索请求中的顺序匹配。如果某个特定搜索请求完全失败,则将返回包含
error
消息和相应状态代码的对象,以替代实际的搜索响应。
示例
编辑标头包含要搜索的数据流、索引和别名。标头还指示 search_type
、preference
和 routing
。正文包含典型的搜索正文请求(包括 query
、aggregations
、from
、size
等)。
$ 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
参数中明确指定。例如
resp = client.msearch( index="my-index-000001", searches=[ {}, { "query": { "match_all": {} }, "from": 0, "size": 10 }, {}, { "query": { "match_all": {} } }, { "index": "my-index-000002" }, { "query": { "match_all": {} } } ], ) print(resp)
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
const response = await client.msearch({ index: "my-index-000001", searches: [ {}, { query: { match_all: {}, }, from: 0, size: 10, }, {}, { query: { match_all: {}, }, }, { index: "my-index-000002", }, { query: { match_all: {}, }, }, ], }); console.log(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
,以全局应用于所有搜索请求。
安全性
编辑请参阅 基于 URL 的访问控制