ES批量查询
在 Elasticsearch 中,multi_search(也称为 msearch)是一种允许你在单个请求中执行多个搜索操作的 API。它可以显著减少网络开销,尤其是在需要执行多个查询时。multi_search 会将多个查询打包成一个请求发送给 Elasticsearch,然后返回多个查询的结果。
1. multi_search 的基本用法
multi_search 的请求格式如下:
-
请求头:指定索引名称(可选)和搜索参数。
-
请求体:每个查询由两部分组成:
-
一个可选的
header部分,用于指定索引、类型和搜索参数。 -
一个
body部分,用于指定查询 DSL。
-
示例
以下是一个 multi_search 的示例,包含两个查询:
json
复制
POST /_msearch
{}
{"index": "index1"}
{"query": {"match_all": {}}, "size": 10}
{}
{"index": "index2"}
{"query": {"match": {"field": "value"}}, "size": 5}
-
第一个查询:在
index1中执行match_all查询,返回最多10条文档。 -
第二个查询:在
index2中执行match查询,返回最多5条文档。
2. multi_search 的响应
multi_search 的响应是一个数组,数组中的每个元素对应一个查询的结果。例如:
json
复制
{
"responses": [
{
"took": 10,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 100,
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "index1",
"_type": "_doc",
"_id": "1",
"_score": 1.0,
"_source": {
"field": "value1"
}
},
...
]
}
},
{
"took": 5,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 50,
"relation": "eq"
},
"max_score": 1.5,
"hits": [
{
"_index": "index2",
"_type": "_doc",
"_id": "2",
"_score": 1.5,
"_source": {
"field": "value2"
}
},
...
]
}
}
]
}
-
responses:是一个数组,每个元素对应一个查询的结果。 -
每个查询的结果与普通的
_search请求返回的结果格式相同。
3. multi_search 的优势
-
减少网络开销:
-
将多个查询打包成一个请求,减少了客户端与 Elasticsearch 之间的网络往返次数。
-
适合需要同时执行多个查询的场景。
-
-
提高性能:
-
Elasticsearch 会并行处理
multi_search中的查询,从而提高查询效率。
-
-
灵活性:
-
可以在一个请求中查询多个索引,甚至可以为每个查询指定不同的索引和参数。
-
4. multi_search 的使用场景
-
批量查询:
-
当需要同时执行多个查询时,可以使用
multi_search来减少网络开销。 -
例如,在前端页面中同时加载多个模块的数据。
-
-
多索引查询:
-
当需要从多个索引中查询数据时,可以使用
multi_search来简化查询逻辑。
-
-
性能优化:
-
当需要优化查询性能时,可以将多个查询合并为一个
multi_search请求。
-
5. 示例代码
以下是一个完整的 multi_search 示例,包含两个查询:
请求
json
复制
POST /_msearch
{}
{"index": "index1"}
{"query": {"match_all": {}}, "size": 10}
{}
{"index": "index2"}
{"query": {"match": {"field": "value"}}, "size": 5}
响应
json
复制
{
"responses": [
{
"took": 10,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 100,
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "index1",
"_type": "_doc",
"_id": "1",
"_score": 1.0,
"_source": {
"field": "value1"
}
},
...
]
}
},
{
"took": 5,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 50,
"relation": "eq"
},
"max_score": 1.5,
"hits": [
{
"_index": "index2",
"_type": "_doc",
"_id": "2",
"_score": 1.5,
"_source": {
"field": "value2"
}
},
...
]
}
}
]
}
6. 总结
-
multi_search是一种高效的批量查询机制,适合同时执行多个查询。 -
优势:减少网络开销、提高性能、支持多索引查询。
-
使用场景:批量查询、多索引查询、性能优化。
通过合理使用 multi_search,可以显著提高查询效率,尤其是在需要执行多个查询的场景中。
