ES中实现分页查询数据并返回想要的字段
在日志收集系统中,最近需要通过httpclient获取es中的日志信息,所以学习了一些es的查询语句方面的用法;
分页
分页的本质
分页的本质是从“大的数据集”中取出一部分。比如10000条记录,每页10条数据。取第二页即第11条到20条数据。ES或者数据库怎么知道哪些数据是第二部分(第2页),哪些是第三部分(第3页)呢?答案是ES或者数据库不知道,所以正确的分页必须要指定分页的顺序,即要有order by或者sort语句。
在ES中有三种方式可以实现分页:from+size、scroll、search_after
from+size
{"size":10,"from":0;"query":{"bool":{"filter":{"range":{"beginTimeStr111":{"gte":"2019-01-06T00:00:01.638Z","lte":"2019-01-06T23:59:59.330Z","time_zone":"+08:00"}}},"must":{"match":{//匹配的字段信息}}}},
在上述查询语句中,from字段的值表示的是从所有信息的第0行开始,找出size条的信息,如果需要找出第21到第30条的信息,则应该设置from = 21, size = 10.
在实际应用中,我们可以设置两者的数值大小,以适应不同的需求。
scroll(快照分页)
相对于from和size的分页来说,使用scroll可以模拟一个传统数据的游标,记录当前读取的文档信息位置。这个分页的用法,不是为了实时查询数据,而是为了一次性查询大量的数据(甚至是全部的数据)。因为这个scroll相当于维护了一份当前索引段的快照信息,这个快照信息是你执行这个scroll查询时的快照。在这个查询后的任何新索引进来的数据,都不会在这个快照中查询到。但是它相对于from和size,不是查询所有数据然后剔除不要的部分,而是记录一个读取的位置,保证下一次快速继续读取。
curl -XGET 'localhost:9200/twitter/tweet/_search?scroll=1m' -d '{"query": {"match" : {"title" : "elasticsearch"}}}
//通过返回的scroll_id继续查找信息
curl -XGET '集群节点IP:9200/_search/scroll?scroll=1m&scroll_id=c2Nhbjs2OzM0NDg1ODpzRlBLc0FXNlNyNm5JWUc1'
该查询会自动返回一个_scroll_id,通过这个id(经过base64编码)可以继续查询
search_after
search_after参数通过提供实时游标来解决分页中遇到的消耗内存和时间增长问题。
检索第一页的数据后,
POST twitter/_search
{"size": 10,"query": {"match" : {"title" : "elasticsearch"}},"sort": [{"date": "asc"},{"_id": "desc"}]
}
上面的请求会为每一个文档返回一个包含sort排序值的数组。这些sort排序值可以被用于 search_after 参数里以便抓取下一页的数据。比如,我们可以使用最后的一个文档的sort排序值,将它传递给 search_after 参数:
GET twitter/_search
{"size": 10,"query": {"match" : {"title" : "elasticsearch"}},"search_after": [1463538857, "654323"],"sort": [{"date": "asc"},{"_id": "desc"}]
}
当使用search_after时,from的属性值应该置为0或者-1,也可以不设置from这个属性。
返回字段
应用_source可以返回使用者想要返回的字段
{"_source": {"includes": [ "beginTimeStr111", "clientIP" , "executeTime","retCode","srvName"]}, "size": 40,"from": 0
}
includes属性中表示的是想要获取的字段,excludes表示不想要的字段,
_source虽然很好用,但是它会占用很大的索引的存储空间,可以通过enabled false禁用
ES中实现分页查询数据并返回想要的字段相关推荐
- MySQL中的分页查询
MySQL中的分页查询 一.MySQL分页查询原则 在MySQL数据库中使用limit子句进行分页查询: MySQL分页中开始位置为0: 分页子句在查询语句的最后侧: 二.Limit子句(较为常 ...
- Mybatis+MySQL动态分页查询数据经典案例
最近在用Mybatis做项目的时候遇到了不少问题,今天我就在这和大家分享一下,稀稀拉拉的研究了两天,终于搞好了! 开发人员:1111 开发软件:Myeclipse 用到的框架技术:Mybatis 数据 ...
- Mybatis+MySQL动态分页查询数据经典案例(含代码以及测试)
最近在用Mybatis做项目的时候遇到了不少问题,今天我就在这和大家分享一下,稀稀拉拉的研究了两天,终于搞好了! 开发人员:1111 开发软件:Myeclipse 用到的框架技术:Mybatis 数据 ...
- 数据库不断有新数据插入, 导致分页查询数据重复的问题
问题描述 首先, 查询数据时是按照数据的录入时间分页查询的, 最新的数据一直是第1页; 同时, 库表不断地有新数据写入, 这就导致了分页查询数据请求出现重复问题. 例如19:31分时分页查询请求第1页 ...
- react 前端分页查询数据导出excel
react 前端分页查询数据导出excel 前言 一.安装file-saver.xlsx插件 二.创建export.ts文件 三.导出方法 前言 需求:前端实现导出Table中所有数据(不止是当前页面 ...
- java分页显示12345_elasticsearch分页查询数据restful api以及java代码实现
elasticsearch分页查询数据restful api以及java代码实现 restful api实现如下: { "from": 0, "size": 2 ...
- JAVA操作ES中的BoolQueryBuilder 查询方法
一,创建es的连接 public TransportClient transportClient(){ Settings settings = Settings.builder() ...
- 在Oracle中使用分页查询
在Oracle中使用分页查询 什么是分页查询 为什么要分页 在哪分页 Oracle的ROWNUM Oracle如何写分页SQL 什么是分页查询 分页查询就是将所要浏览的内容进行合理分页,方便用户查询观 ...
- 如何实现Oracle中的分页查询
Oracle中的分页查询 以scott账户中的emp表和dept表为例 最内层:主要负责排序 String sql = "select e.* from emp e inner join d ...
最新文章
- SAP PM 初级系列14 - 维修工单的凭证流
- pxe安装linux后命令不可用,CentOS7下的PXE无人值守系统安装(亲测成功)
- out.print 嵌套html代码_Shiny与HTML
- 过年了,花money的时候到了
- 移动互联网的下个十年猜想
- 第一篇:数据库服务概述
- tomcat:Could not publish to the server. java.lang.IndexOutOfBoundsException
- linux shell 学习小结
- oracle 11g安装教程
- Erlang OTP学习(3) supervisor
- 潘淳(寒树Office):不务正业的公众号满月了,都写了些啥?
- java与python难度对比_Python和Java的区别,看完这篇文章你就清楚啦
- 论文集 | 精选133篇知识图谱论文
- android电视原理图,电视机工作原理
- Fence Repair (poj3253)
- MySQL数据库反向生成powerdesigner模型
- MySQL数据库定期自动备份(定时任务)
- AtCoder Grand Contest 007题解
- emi滤波matlab,【原创】EMI 滤波器设计从入门到精通(三)
- iPhone蓝牙回控,iPhone手机互联,认证