Skip to main content

多个搜索请求 msearch

Multi Search API

_msearch API允许在同一API中执行多个搜索请求。

请求的格式类似于批量API格式,并使用换行分隔的JSON(NDJSON)格式。结构如下

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

注意:数据的最后一行必须以换行符\n结尾。每个换行符前面都可以加上回车符\r。向该接口发送请求时,Content-Type头应设置为application/x-ndjson。

头部包括要搜索的index、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
note

注意,上面包括一个empty header的示例(也可以只是没有任何内容)这是支持的。

响应返回一个响应数组,其中包含搜索响应和每个搜索请求的状态代码,这些搜索请求与原始多搜索请求中的顺序相匹配。如果该特定搜索请求完全失败,则将返回一个带有错误消息和相应状态代码的对象来代替实际的搜索响应。

接口还允许根据URI本身中的一个或多个索引进行搜索。例如:

GET twitter/_msearch
{}
{"query" : {"match_all" : {}}, "from" : 0, "size" : 10}
{}
{"query" : {"match_all" : {}}}
{"index" : "twitter2"}
{"query" : {"match_all" : {}}}

上面将针对所有未定义索引的请求执行twitter索引搜索,最后一个将针对twitter2索引执行。

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

msearch的max_concurrent_searchs请求参数可用于控制多搜索api将执行的最大并发搜索数。

info

请求参数max_concurrent_shard_requests可用于控制每个子搜索请求将执行的并发shard请求的最大数量。该参数应用于保护单个请求不使集群过载(例如,如果每个节点的shard数量较高,默认请求将命中集群中的所有索引,这可能会导致shard请求被拒绝)。此默认值基于集群中的数据节点数量,但最多为256个。在某些情况下,并行性无法通过并发请求实现,因此这种保护将导致性能不佳。例如,在预期并发搜索请求的数量非常少的环境中,将此值增加到更高的数量可能会有所帮助。

Template support

_msearch也提供了对模板的支持。按如下方式提交:

GET _msearch/template
{"index" : "twitter"}
{ "source" : "{ \"query\": { \"match\": { \"message\" : \"{{keywords}}\" } } } }", "params": { "query_type": "match", "keywords": "some message" } }
{"index" : "twitter"}
{ "source" : "{ \"query\": { \"match_{{template}}\": {} } }", "params": { "template": "all" } }

用于inline templates。

您还可以创建搜索模板

POST /_scripts/my_template_1
{
"script": {
"lang": "mustache",
"source": {
"query": {
"match": {
"message": "{{query_string}}"
}
}
}
}
}
POST /_scripts/my_template_2
{
"script": {
"lang": "mustache",
"source": {
"query": {
"term": {
"{{field}}": "{{value}}"
}
}
}
}
}

然后在_msearch中使用它们:

GET _msearch/template
{"index" : "main"}
{ "id": "my_template_1", "params": { "query_string": "some message" } }
{"index" : "main"}
{ "id": "my_template_2", "params": { "field": "user", "value": "test" } }

部分响应

为了确保快速响应,如果一个或多个shard失败,_msearch API将以部分结果进行响应。