多搜索 API
编辑多搜索 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
描述编辑
多搜索 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
- 匹配隐藏的数据流和隐藏的索引。必须与
open
、closed
或两者结合使用。 -
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
- 匹配隐藏的数据流和隐藏的索引。必须与
open
、closed
或两者结合使用。 -
none
- 不接受通配符模式。
默认为
open
。 -
-
ignore_unavailable
- (可选,布尔值)如果为
true
,则来自缺少或关闭的索引的文档不包含在响应中。默认为false
。 -
index
-
(可选,字符串或字符串数组)要搜索的数据流、索引和别名。支持通配符 (
*
)。将多个目标指定为数组。如果未指定此参数,则
<target>
请求路径参数将用作回退。 -
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
参数中明确指定。例如
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
,以全局应用于所有搜索请求。
安全性编辑
请参阅基于 URL 的访问控制