mget是es提供的一种批量的读取操作的API。
mget API允许根据索引,类型(可选)和id(以及可能的路由)获取多个文档。响应包括一个docs数组。该数组具有与原始多重获取请求相对应的所有提取文档(如果特定的get失败,则在响应中包含包含此错误的对象)。成功获取的结构与get API提供的文档的结构相似。
示例索引结构如下
PUT example PUT example/docs/_mapping { "properties": { "id": {"type": "long"}, "name": {"type": "text"}, "counter": {"type": "integer"}, "tags": {"type": "text"} } } PUT example/docs/1 { "id": 1, "name": "admin", "counter": 1, "tags": ["gray"] } PUT example/docs/2 { "id": 2, "name": "zhangsan", "counter": 1, "tags": ["black"] } PUT example/docs/3 { "id": 3, "name": "lisi", "counter": 1, "tags": ["purple"] } PUT example_test PUT example_test/docs/_mapping { "properties": { "id": {"type": "long"}, "name": {"type": "text"}, "counter": {"type": "integer"}, "tags": {"type": "text"} } } PUT example_test/docs/1 { "id": 1, "name": "test-admin", "counter": 1, "tags": ["gray"] } PUT example_test/docs/2 { "id": 2, "name": "test-zhangsan", "counter": 1, "tags": ["black"] } PUT example_test/docs/3 { "id": 3, "name": "test-lisi", "counter": 1, "tags": ["purple"] } #查询example所有数据 GET example/docs/_search { "query": { "match_all": {} } } #查询example_test所有数据 GET example_test/docs/_search { "query": { "match_all": {} } }示例查询
GET example/docs/1 GET example/docs/2 GET example_test/docs/1 GET example_test/docs/2这样其实局限性,多次的网络请求很容易造成资源浪费和降低性能。
示例如下
GET _mget { "docs": [ { "_index": "example", "_type": "docs", "_id": "1" }, { "_index": "example", "_type": "docs", "_id": "2" }, { "_index": "example_test", "_type": "docs", "_id": "1" }, { "_index": "example_test", "_type": "docs", "_id": "2" } ] }返回数据如下
{ "docs": [ { "_index": "example", "_type": "docs", "_id": "1", "_version": 1, "found": true, "_source": { "id": 1, "name": "admin", "counter": 1, "tags": [ "gray" ] } }, { "_index": "example", "_type": "docs", "_id": "2", "_version": 1, "found": true, "_source": { "id": 2, "name": "zhangsan", "counter": 1, "tags": [ "black" ] } }, { "_index": "example_test", "_type": "docs", "_id": "1", "_version": 1, "found": true, "_source": { "id": 1, "name": "test-admin", "counter": 1, "tags": [ "gray" ] } }, { "_index": "example_test", "_type": "docs", "_id": "2", "_version": 1, "found": true, "_source": { "id": 2, "name": "test-zhangsan", "counter": 1, "tags": [ "black" ] } } ] }不建议掌握,type有可能在后续的版本废除。这里只做一下简单示例。
GET _mget { "docs": [ { "_index": "example", "_type": "docs1", "_id": "1" }, { "_index": "example", "_type": "docs2", "_id": "1" }, ]示例如下
GET _mget { "docs": [ { "_index": "example", "_type": "docs", "_id": "1" }, { "_index": "example", "_type": "docs", "_id": "2" }, { "_index": "example", "_type": "docs", "_id": "3" } ] } #index和type相同的话可以简化成如下 GET example/docs/_mget { "docs": [ { "_id": "1" }, { "_id": "2" }, { "_id": "3" } ] }返回结果
{ "docs": [ { "_index": "example", "_type": "docs", "_id": "1", "_version": 1, "found": true, "_source": { "id": 1, "name": "admin", "counter": 1, "tags": [ "gray" ] } }, { "_index": "example", "_type": "docs", "_id": "2", "_version": 1, "found": true, "_source": { "id": 2, "name": "zhangsan", "counter": 1, "tags": [ "black" ] } }, { "_index": "example", "_type": "docs", "_id": "3", "_version": 1, "found": true, "_source": { "id": 3, "name": "lisi", "counter": 1, "tags": [ "purple" ] } } ] }mget是很重要的,一般来说,进行查询的时候,如果一次性查询多条数据的话,那么一定要用batch批量操作的api,尽可能减少网络开销次数,可以将性能大幅度提升。
瘦子没有夏天 认证博客专家 博客专家 Java深度用户 大家好,我是Leon。一个专业与Java领域的程序员,偶尔理理财。欢迎大家来阅读我博客,如果你发现极个别文章和书籍内容雷同,请叫我勤奋的code搬运工٩(๑❛ᴗ❛๑)۶。我的邮箱:gyoomi0709@foxmail.com