1.概述

转载并且补充:elasticsearch里面的关于批量读取mget的用法

es的api除了提供了基本的curd操作外,还有两个针对批量的操作分别是:

  • 批量的读取操作(mget)
  • 批量的写入操作(bulk)

本篇文章先介绍mget的用法

Multi Get api 简称(mget)它允许我们一次get大量的document,与get单条数据的api get方法类似,mget查询是基于index,type(可选),id三个条件进行的,比如我们可以一次mget 50条数据,这50条数据可以是在50个不同index中,并且每一个get都可以单独指定它的路由查询信息,或者返回的字段内容。

mget可以批量的根据index,type,id三个字段来获取一批数据,它不能用来查询,最少得需要知道index 和 id两个字段的值,才能进行get,这一点与query是不一样的。

用法如下:

mget可以有三种请求头

1.1 不指定index


GET /_mget
{"docs" : [{"_index" : "demo_idx","_type" : "_doc","_id" : "1"},{"_index" : "demo_idx","_type" : "_doc","_id" : "2"}]
}

查询结果如下

 {"_index" : "demo_idx","_type" : "_doc","_id" : "1","_version" : 1,"_seq_no" : 0,"_primary_term" : 1,"found" : true,"_source" : {"content" : "Distributed nature, simple REST APIs, speed, and scalability"}},{"_index" : "demo_idx","_type" : "_doc","_id" : "2","_version" : 1,"_seq_no" : 1,"_primary_term" : 1,"found" : true,"_source" : {"content" : "Distributed nature, simple APIs, speed, and scalability"}}

1.2 指定index

GET /demo_idx/_mget
{"docs" : [{"_type" : "_doc","_id" : "1"},{"_type" : "_doc","_id" : "2"}]
}

查询结果如下

 {"_index" : "demo_idx","_type" : "_doc","_id" : "1","_version" : 1,"_seq_no" : 0,"_primary_term" : 1,"found" : true,"_source" : {"content" : "Distributed nature, simple REST APIs, speed, and scalability"}},{"_index" : "demo_idx","_type" : "_doc","_id" : "2","_version" : 1,"_seq_no" : 1,"_primary_term" : 1,"found" : true,"_source" : {"content" : "Distributed nature, simple APIs, speed, and scalability"}}

1.3 指定index和type


GET /demo_idx/_doc/_mget
{"docs" : [{"_id" : "1"},{"_id" : "2"}]
}简写方式
GET /demo_idx/_doc/_mget
{"ids" : ["1", "2"]
}

此外,还可以单独的设置对返回的数据(source)进行过滤操作,默认情况下如果这条数据被store了,那么它会返回整个document。

2,几种过滤的方式:

2.1 使用source过滤

GET /_mget
{"docs" : [{"_index" : "demo_idx","_type" : "_doc","_id" : "1","_source" : false},{"_index" : "demo_idx","_type" : "_doc","_id" : "2","_source" : ["content", "field4"]},{"_index" : "demo_idx","_type" : "_doc","_id" : "3","_source" : {"include": ["user"],"exclude": ["user.location"]}}]
}

2.2 使用fields过滤

GET /_mget
{"docs" : [{"_index" : "test","_type" : "_doc","_id" : "1","stored_fields" : ["field1", "field2"]},{"_index" : "test","_type" : "_doc","_id" : "2","stored_fields" : ["field3", "field4"]}]
}

source和fields的主要区别在于,source默认将整个json存在一起,在读取时候只需要加载一次然后再解析出来需要的字段,而store字段则是每个字段单独的存储,所以大部分时候推荐使用source字段,虽然会多占一些存储空间,但在读取字段数比较多的情况下,source的性能是比store字段要更好的,但是如果你disable了source字段,则意味着:

  • 你不能够高亮文本(不推荐在服务端做高亮,推荐客户端做)
  • 你不能reindex索引
  • 你不能做partial update

所以综合考虑,推荐还是使用source字段

2.3 路由

在get的时候,还可以使用路由字段,如下:

GET /_mget?routing=key1
{"docs" : [{"_index" : "test","_type" : "_doc","_id" : "1","routing" : "key2"},{"_index" : "test","_type" : "_doc","_id" : "2"}]
}

3. java

最后在看下在java api里面如何使用:

//构建一个mget的查询MultiGetRequestBuilder  multi_get=  client.prepareMultiGet();//添加两条get数据multi_get.add("a_active","active","1");multi_get.add("b_active","active","2","3");//获取响应MultiGetResponse mgr= multi_get.get();//循环读取for (MultiGetItemResponse itemResponse : mgr) {GetResponse response = itemResponse.getResponse();//如果存在则打印响应消息if (response.isExists()) {String json = response.getSourceAsString();System.out.println(" source data: "+json);}}

4.总结

本文介绍了es里面的批量读取数据的方法mget,这个方法在日常开发中的使用频度并不是很高,但是在特定场景下会拥有较高的效率,比如上篇文章介绍的es的分布式查询的原理的时候,在第一阶段query从每个shard上查询本地的page数据,然后返回到coordinating节点上,并重新进行全局排序再取指定分页的n条数据,接着到了第二阶段fetch,要把这批数据的内容读取出来返回给client,这个时候就是mget发力的时候,通过id组装成一个mget请求,然后发送到每个shard里面获取结果数据,最终组装后在返回给client,这样一来比单条get的效率要高很多,另外对索引的写入也是如此,下篇文章我们会介绍批量写入bulk的用法

【Elasticsearch】elasticsearch里面的关于批量读取mget的用法相关推荐

  1. json字段顺序读取 python_如何利用Python批量读取视频文件的时间长度?

    本期的主题是利用Python来实现对视频文件时间长度的读取. 在学习编程语言时,相比较于通过书本来学习知识,我更喜欢通过观看学习视频的方式来进行学习,通过主讲老师的讲解,我能很直观且快速的了解一些知识 ...

  2. python批量提取word指定内容_使用python批量读取word文档并整理关键信息到excel表格的实例...

    目标 最近实验室里成立了一个计算机兴趣小组 倡议大家多把自己解决问题的经验记录并分享 就像在CSDN写博客一样 虽然刚刚起步 但考虑到后面此类经验记录的资料会越来越多 所以一开始就要做好模板设计(如下 ...

  3. python中读取word信息_Python实现批量读取word中表格信息的方法

    本文实例讲述了Python实现批量读取word中表格信息的方法.分享给大家供大家参考.具体如下: 单位收集了很多word格式的调查表,领导需要收集表单里的信息,我就把所有调查表放一个文件里,写了个py ...

  4. Tensorflow分批量读取tfrecords

    Tensorflow分批量读取数据 之前的博客里使用tf读取数据都是每次fetch一条记录,实际上大部分时候需要fetch到一个batch的小批量数据,在tf中这一操作的明显变化就是tensor的ra ...

  5. python批量读取csv文件-Python读取/批量读取文件

    相信很多人的日常工作中,数据源除了来自数据库以外,其次就是外部文件,因此掌握读取文件的技能是相当必要的.在这里特此整理读取外部文件的方法,希望能有助你们快速解决问题.当然本文对读者的假设是有一定的py ...

  6. python导入txt为dataframe-python批量读取txt文件为DataFrame的方法

    我们有时候会批量处理同一个文件夹下的文件,并且希望读取到一个文件里面便于我们计算操作.比方我有下图一系列的txt文件,我该如何把它们写入一个txt文件中并且读取为DataFrame格式呢? 首先我们要 ...

  7. python批量读取csv文件-使用Python读写csv文件的三种方法

    行之间无空行十分重要,如果有空行或者数据集中行末有空格,读取数据时一般会出错,引发[list index out of range]错误.PS:已经被这个错误坑过很多次! 使用python I/O写入 ...

  8. pillow模块批量 读取图像、旋转、放缩、裁剪图片等操作

    1_pillow模块批量 读取图像.旋转.放缩.裁剪图片等操作(20190104 文章目录 1.pillow的安装和导入 2.pillow 读取.放缩.旋转.左右翻转.上下翻转图片操作 3.pillo ...

  9. python批量读取grib_windows python读取grib2数据

    一.环境准备 (1).python3环境 (3).wgirb2工具(用于读取grib2文件),下载地址:ftp://ftp.cpc.ncep.noaa.gov/wd51we/wgrib2 二.环境测试 ...

最新文章

  1. linux 天堂测试软件,[Ubuntu] HTTP Live Streaming 安装测试
  2. pandas 知识点补充:绘图plot
  3. 【实验】华为静态路由基础配置
  4. 邬贺铨:区块链技术将确保物联网隐私和安全
  5. 编程学习初体验(5. 如何自学编程)(3)
  6. Thrift CentOS安装和使用
  7. Codeforeces Round #226 (Div. 2) E---Bear in the Field(矩阵快速幂)
  8. Golang 中 RSA 算法的使用
  9. Spring IOC中bean标签和管理对象细节
  10. Java监测他人的消息_Java中的Listener 监听器
  11. java 图片转pdf_在Java语言中将图像转换为PDF?Spire.PDF for Java轻松搞定!
  12. 华为nova4e可以升级鸿蒙系统吗,华为nova4e官方出厂固件rom刷机包下载_原版系统强刷升级更新包...
  13. 中国程序员鼓励师都干啥? 美媒:按摩谈心样样通
  14. php qps是什么意思,QPS是什么意思
  15. pytorch锁死在dataloader(训练时卡死)
  16. 华科计算机考研2021年分数,华中科技大学2021考研分数线已公布
  17. 算法设计与分析 SCAU17964 水桶打水
  18. HBuilder 打包 iOS 客户端会产生广告标识符的问题
  19. 排针排母连接器的介绍
  20. Echarts3.0的简单使用,动态获取数据

热门文章

  1. 拼多多年货节上线,“百亿补贴”加码iPhone 12等产品
  2. 华为Mate 40正式发布:4999元起、买吗?
  3. iPhone 12 5G更耗电?续航时间较4G妥妥地缩短不少
  4. 华为Mate 40手机将于国庆节发售:搭载全新5nm芯片
  5. 又错过了暴富的机会!亚马逊AWS突发Bug,比特币现史诗级捡漏机会?
  6. EMUI10 亮相开发者大会:分布式设计打造全场景体验
  7. 中兴高调秀Axon 10 Pro 5G版20倍变焦样张:号称媲美万元广角镜头
  8. 中国联通辟谣“不支持华为”:恶意诽谤 将通过法律手段维护权益
  9. 国内电动车召回12万辆有余 电池衰减和充电故障成头号问题
  10. 反转!继SDA之后 WiFi联盟、蓝牙技术联盟、JEDEC协会恢复华为会员资格