Mysql 分页查询 快照_ElasticSearch—分页查询
ElasticSearch查询—分页查询详解
Elasticsearch中数据都存储在分片中,当执行搜索时每个分片独立搜索后,数据再经过整合返回。那么,如何实现分页查询呢?
按照一般的查询流程来说,如果我想查询前10条数据:
1)客户端请求发给某个节点
2)节点转发给个个分片,查询每个分片上的前10条
3)结果返回给节点,整合数据,提取前10条
4)返回给请求客户端
那么当我想要查询第10条到第20条的数据该怎么办呢?这个时候就用到分页查询了。
在ElasticSearch中实现分页查询的方式有两种,分别为深度分页(from-size)和快照分页(scroll)
1.深度分页(from-size)
原理很简单,就是查询前20条数据,然后截断前10条,只返回10-20的数据。这样其实白白浪费了前10条的查询。
查询API如下:
{
“from” : 0, “size” : 10,
“query” : {
“term” : { “user” : “kimchy” }
}
}
其中,from定义了目标数据的偏移值,size定义当前返回的事件数目。默认from为0,size为10,即所有的查询默认仅仅返回前10条数据。
做过测试,越往后的分页,执行的效率越低。也就是说,分页的偏移值越大,执行分页查询时间就会越长!
- 快照分页(scroll)
相对于from和size的分页来说,使用scroll可以模拟一个传统数据的游标,记录当前读取的文档信息位置。这个分页的用法,不
是为了实时查询数据,而是为了一次性查询大量的数据(甚至是全部的数据)。因为这个scroll相当于维护了一份当前索引段的快照
信息,这个快照信息是你执行这个scroll查询时的快照。在这个查询后的任何新索引进来的数据,都不会在这个快照中查询到。但是
它相对于from和size,不是查询所有数据然后剔除不要的部分,而是记录一个读取的位置,保证下一次快速继续读取。
查询API如下:
curl -XGET ‘localhost:9200/twitter/tweet/_search?scroll=1m’ -d ‘
{
“query”: {
“match” : {
“title” : “elasticsearch”
}
}
}
该查询会自动返回一个_scroll_id,通过这个id(经过base64编码)可以继续查询。
curl -XGET ‘集群节点IP:9200/_search/scroll?scroll=1m&scroll_id=c2Nhbjs2OzM0NDg1ODpzRlBLc0FXNlNyNm5JWUc1’
3.java API实现
public class PageQueryInElasticSearch {
private static String index = “test_index35”;
private static String type = “test_type35”;
public static void main(String[] args) {
Settings settings = ImmutableSettings.settingsBuilder().put(“cluster.name”, “contentmanageres”)
.put(“client.transport.sniff”, true)// 开启ES嗅探功能,确保集群连上多个节点
.build();
// 创建客户端
TransportClient transportClient = new TransportClient(settings);
// 添加es的节点信息,可以添加1个或多个
TransportAddress transportAddress = new InetSocketTransportAddress(“172.17.168.96”, 9300);
transportClient.addTransportAddresses(transportAddress);
// 连接到的节点
ImmutableList connectedNodes = transportClient.connectedNodes();
for (DiscoveryNode discoveryNode : connectedNodes) {
System.out.println(discoveryNode.getHostAddress());
}
System.out.println(“from size 模式启动!”);
Date begin = new Date();
long count = transportClient.prepareCount(index).setTypes(type).execute().actionGet().getCount();//获取所有记录
SearchRequestBuilder requestBuilder = transportClient.prepareSearch(index).setTypes(type).setQuery(QueryBuilders.matchAllQuery());
for(int i=0,sum=0; sum
SearchResponse response = requestBuilder.setFrom(i).setSize(5000).execute().actionGet();
sum += response.getHits().hits().length;
System.out.println(“总量”+count+” 已经查到”+sum);
}
Date end = new Date();
System.out.println(“耗时: “+(end.getTime()-begin.getTime()));
System.out.println(“scroll 模式启动!”);
begin = new Date();
SearchResponse scrollResponse = transportClient.prepareSearch(index)
.setSearchType(SearchType.SCAN) //在ES 5.x版本中不存在SearchType.SCAN用法,可以用addSort(SortBuilders.fieldSort(“_doc”))
.setSize(1000) //实际返回的数量为size*index的主分片个数(在ES 5.x版本中,返回的数据量就是参数中指定的数据量)
.setScroll(TimeValue.timeValueMinutes(1))
.execute().actionGet();
count = scrollResponse.getHits().getTotalHits();//获取所有记录,第一次不返回数据(在ES 5.x版本中,第一次有数据返回)
for(int sum=0; sum
scrollResponse = transportClient.prepareSearchScroll(scrollResponse.getScrollId())
.setScroll(TimeValue.timeValueMinutes(8))
.execute().actionGet();
sum += scrollResponse.getHits().hits().length;
System.out.println(“总量”+count+” 已经查到”+sum);
}
end = new Date();
System.out.println(“耗时: “+(end.getTime()-begin.getTime()));
}
}
相关链接如下:https://www.cnblogs.com/xing901022/archive/2016/03/16/5284902.html
http://www.jianshu.com/p/627887e3eea3
-——————————
作者:午夜阳光psb
来源:CSDN
原文:https://blog.csdn.net/u013514928/article/details/78749419
版权声明:本文为博主原创文章,转载请附上博文链接!
elasticsearch 分页查询实现方案——Top K+归并排序
elasticsearch 分页查询实现方案 1. from+size 实现分页 from表示从第几行开始,size表示查询多少条文档.from默认为0,size默认为10,注意:size的大小不能超 …
Elasticsearch——分页查询From&Size VS scroll
Elasticsearch中数据都存储在分片中,当执行搜索时每个分片独立搜索后,数据再经过整合返回.那么,如果要实现分页查询该怎么办呢? 更多内容参考Elasticsearch资料汇总 按照一般的查询 …
elasticsearch 分页查询实现方案
- from+size 实现分页 from表示从第几行开始,size表示查询多少条文档.from默认为0,size默认为10, 注意:size的大小不能超过index.max_result_wind …
ElasticSearch——分页查询
前言 ElasticSearch实现分页查询,有3种方式,他们在数据查询中各自占据着不同的优势,因此在搜索引擎的数据分页过程中,如何更好地利用各自的优势来进行数据查询是一个非常重要的过程. 传统分页( …
Elasticsearch教程(九) elasticsearch 查询数据 | 分页查询
Elasticsearch 的查询很灵活,并且有Filter,有分组功能,还有ScriptFilter等等,所以很强大.下面上代码: 一个简单的查询,返回一个List .. …
ES 25 - Elasticsearch的分页查询及其深分页问题 (deep paging)
目录 1 分页查询方法 2 分页查询的deep paging问题 1 分页查询方法 在GET请求中拼接from和size参数 // 查询10条数据, 默认从第0条数据开始 GET book_shop/ …
mysql分库 分页查询
Mysql海量数据分表分库如何列表分页? 1.现在使用ElasticSearch了.基于Lucene的解决方案 2.必须将mysql里的数据写入到类似hbase这样的分布式数据库,查询快.但分页.查询 …
使用elasticsearch分页时报max_result_window is too large的错误解决方案
使用elasticsearch进行深度分页查询时的size-from大于10000的时候,会提示一个max_result_window is too large的错误. 官方推荐是scroll查询返回 …
HBase多条件及分页查询的一些方法
HBase是Apache Hadoop生态系统中的重要一员,它的海量数据存储能力,超高的数据读写性能,以及优秀的可扩展性使之成为最受欢迎的NoSQL数据库之一.它超强的插入和读取性能与它的数据组织方式 …
随机推荐
System call in linux by C
1: #include 2: int system(const char *command); 3: 4: while (something) { 5: int r …
Cannot retrieve definition for form bean null on action错误
Cannot retrieve definition for form bean null on action错误 1. 如果jsp页面中要用到
&l …
hadoop的一些名词解释
在网上收集了一些mapreduce中常用的一些名词的解释,分享一下: Shuffle(洗牌):当第一个map任务完成后,节点可能还要继续执行更多的map 任务,但这时候也开始把map任务的中间输出交换 …
[SDOI2010]地精部落
题目描述 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为N的山脉H可分为从左到右的N段,每段有一个[b][u]独一无二[/u][/b]的高度Hi, …
Jupyter notebook 输出含中文的pdf 方法
我电脑 OS 是 Ubuntu14.04, 可用的最简单方法是: 打开终端,输入 sudo find / -name article.tplx 用以查找 article.tplx 文件位置,我电脑的结 …
Linux下查看80端口是否被占用
方式一: ps -ef |grep 80 方式二: netstat -anp |grep :80 方式三: lsof -i:80 方式四: netstat -tunlp |grep :80 方式五: …
(4.28)for xml path 在合并拆分上的作用演示
for xml path 用于合并与拆分 1.合并 很多时候需要在SQL Server中创建逗号分隔列表.这可以使用SQL Server的DOR XML PATH功能完成.与select语句一起使用时 …
使用STM32CubeMX生成USB_HOST_HID工程
使用开发板为STM32F105开发板. 原本想将具体步骤给写出来.时间有限.直接将STM32F105_USBH_HID.IOC上传files.cnblogs.com/files/libra13179/ …
通过 sysprocesses 简单查询死锁及解决死锁办法
简单查询死锁,如下四步可以轻松解决: 第一步:查询死锁语句 1: 条件是 blocked <> 0 select dbid,* from sys.sysprocesseswhere 1=1 …
还没有评论,来说两句吧...