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条数据。
做过测试,越往后的分页,执行的效率越低。也就是说,分页的偏移值越大,执行分页查询时间就会越长!
2. 快照分页(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<DiscoveryNode> 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<count; i++){
		    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<count; ){
		    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—分页查询的更多相关文章
- elasticsearch 分页查询实现方案——Top K+归并排序
		elasticsearch 分页查询实现方案 1. from+size 实现分页 from表示从第几行开始,size表示查询多少条文档.from默认为0,size默认为10,注意:size的大小不能超 ... 
- Elasticsearch——分页查询From&Size VS scroll
		Elasticsearch中数据都存储在分片中,当执行搜索时每个分片独立搜索后,数据再经过整合返回.那么,如果要实现分页查询该怎么办呢? 更多内容参考Elasticsearch资料汇总 按照一般的查询 ... 
- elasticsearch 分页查询实现方案
		1. from+size 实现分页 from表示从第几行开始,size表示查询多少条文档.from默认为0,size默认为10, 注意:size的大小不能超过index.max_result_wind ... 
- ElasticSearch——分页查询
		前言 ElasticSearch实现分页查询,有3种方式,他们在数据查询中各自占据着不同的优势,因此在搜索引擎的数据分页过程中,如何更好地利用各自的优势来进行数据查询是一个非常重要的过程. 传统分页( ... 
- Elasticsearch 分页查询
		目录 前言 from + size search after scroll api 总结 参考资料 前言 我们在实际工作中,有很多分页的需求,商品分页.订单分页等,在MySQL中我们可以使用limit ... 
- Elasticsearch分页查询
		global index global CLIENT index = "guajibao-ipused-2019.10.13" CLIENT = Elasticsearch(hos ... 
- Elasticsearch教程(九) elasticsearch 查询数据 | 分页查询
		Elasticsearch 的查询很灵活,并且有Filter,有分组功能,还有ScriptFilter等等,所以很强大.下面上代码: 一个简单的查询,返回一个List<对象> .. ... 
- elasticsearch查询之大数据集分页查询
		一. 要解决的问题 search命中的记录特别多,使用from+size分页,直接触发了elasticsearch的max_result_window的最大值: { "error" ... 
- Elasticsearch from/size-浅分页查询-深分页 scroll-深分页search_after深度查询区别使用及应用场景
		Elasticsearch调研深度查询 1.from/size 浅分页查询 一般的分页需求我们可以使用from和size的方式实现,但是这种的分页方式在深分页的场景下应该是避免使用的.深分页的页次增加 ... 
随机推荐
- unity项目针对IOS及Android平台的音频压缩格式
			IOS : 建议采用MP3格式, Android : 建议采用Vorbis格式, 因为这两种格式分别在这两个平台上有硬件解码的支持, 硬件解码比软件解码快. 
- C#复制数据到剪切板
			C#复制数据到剪切板 1. 复制固定的数据到剪切板 Clipboard.SetText("123456"); 于是123456就已经复制到剪切板中了,无论在任何地方粘贴都会出现‘1 ... 
- Redis之无序集合类型命令
			Redis 集合(Set) Redis 的 Set 是 String 类型的无序集合.集合成员是唯一的,这就意味着集合中不能出现重复的数据. Redis 中集合是通过哈希表实现的,所以添加,删除,查找 ... 
- HTML表单格式化
			HTML表单格式化 一.说明 用table布局 二.效果 三.代码 <!DOCTYPE html> <html> <head> <title>Form. ... 
- C#实现在应用程序间发送消息的方法示例
			本文实例讲述了C#实现在应用程序间发送消息的方法.分享给大家供大家参考,具体如下: 首先建立两个C#应用程序项目. 第一个项目包含一个Windows Form(Form1),在Form1上有一个But ... 
- How to implement connection  pool in spark streaming
			在spark streaming的文档里,有这么一段: def sendPartition(iter): # ConnectionPool is a static, lazily initialize ... 
- 快速搭建一个简易的KMS 服务
			xu言: 之前,闹的沸沸扬扬的KMS激活工具自身都存在问题的事.让我们对以前的什么小马激活.kms激活.各种激活工具都去打了一个深深的“?”,到底哪些能用.哪些不能用.有些还注明的里面必须要关闭杀毒软 ... 
- 用Omniauth来Login with Facebook(Go-rails课程)
			https://gorails.com/episodes/login-with-facebook?autoplay=1 大概看了一遍,留了视频的截图. https://gorails.com/epis ... 
- 在 Confluence 6 中的 Jira 设置
			名字(Name) 输入一个有意义的服务器名字,会让你在 JIRA 服务器中更好的识别你的目录服务器: Jira Service Desk Server My Company Jira 服务器URL(S ... 
- spring 监听器 IntrospectorCleanupListener
			org.springframework.web.util.IntrospectorCleanupListener监听器 主要负责处理由JavaBean Introspector使用而引起的缓冲泄露, ... 
