15.ElasticSearch系列之分布式特性及分布式搜索机制(四)
1. 分页FROM SIZE
GET kibana_sample_data_ecommerce/_search
{"from": 10,"size": 20,"query": {"match_all": {}}
}
2. 分布式系统中深度分页问题及解决方法
2.1 深度分页问题
- ES天生就是分布式的。查询信息,但是数据分别保存在多个分片上,多台机器上,ES天生就需要满足排序的需要
- 当一个查询:From=990,Size=10
- 会在每个分片上先获取1000个文档,然后coordinating node聚合所有结果。最后在通过排序选取前1000个文档
- 页数越深,占用内存越多。为了避免深度分页带来的内存开销。ES有一个设定,默认限制到10000个文档
- index.max_result_window
2.2 Search After避免深度分页问题
- 避免深度分页的性能问题,可以实时获取下一页文档信息
- 不支持指定页数(FROM)
- 只能往下翻
- 第一步搜索需要指定sort,并且保证值是唯一的
- 然后使用上一次,最后一个文档的sort值进行查询
POST users/_doc
{"name":"user1","age":10}
POST users/_doc
{"name":"user2","age":11}
POST users/_doc
{"name":"user2","age":12}
POST users/_doc
{"name":"user2","age":13}POST users/_search
{"size": 1,"query": {"match_all": {}},"sort": [{"age": "desc"} ,{"_id": "asc"} ]
}
POST users/_search
{"size": 1,"query": {"match_all": {}},"search_after":[13,"v96NA4MB3bUwyhQRSg2k"],"sort": [{"age": "desc"} ,{"_id": "asc"} ]
}
2.3 Search After如何解决深度分页问题
- 假定size是10
- 当查询990-1000
- 通过唯一排序值定位,将每次将处理的文档数都控制在10
3. Scorll长查询导出所有文档
# 查询过期时间设置为5分钟,会返回scrollID
POST /users/_search?scroll=5m
{"size": 1,"query": {"match_all" : {}}
}
# 将之前返回的scrollID传入,继续查询
POST _search/scroll
{"scroll" : "1m","scroll_id" : "FGluY2x1ZGVfY29udGV4dF91dWlkDXF1ZXJ5QW5kRmV0Y2gBFnVWcVRUUl9iUU15ekoxNklBM3RTemcAAAAAAAAIyxZvOGMtUkZRZVRpLUR0QV82VW9NZXV3"
}
JAVA版本scroll查询
@Component
public class EsUtils implements ApplicationContextAware {private static final Logger logger = LoggerFactory.getLogger(EsUtils.class);private static RestHighLevelClient restHighLevelClient;/*** 滚动方式查询大批量es数据** @param index 索引* @param boolQuery 查询语句* @param clazz 要返回的实体类型* @param <T>* @return*/public static <T> List<T> scrollQuery(String index, QueryBuilder boolQuery, Class<T> clazz) {List<T> result = new ArrayList<>();// 存活时间,当索引数据量特别大时,出现超时可能性大,此值适当调大Scroll scroll = new Scroll(TimeValue.timeValueMinutes(30L));SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(boolQuery);searchSourceBuilder.size(10000);SearchRequest searchRequest = new SearchRequest().indices(index).scroll(scroll).source(searchSourceBuilder);SearchResponse searchResponse = null;try {searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);} catch (IOException e) {logger.error("查询es数据异常:{}", e);}String scrollId = searchResponse.getScrollId();SearchHit[] searchHits = searchResponse.getHits().getHits();if (searchHits != null) {for (SearchHit searchHit : searchHits) {T t = JSONObject.parseObject(searchHit.getSourceAsString(), clazz);result.add(t);}}// 遍历搜索命中的数据,直到没有数据while (searchHits != null && searchHits.length > 0) {SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);scrollRequest.scroll(scroll);try {searchResponse = restHighLevelClient.scroll(scrollRequest, RequestOptions.DEFAULT);} catch (IOException e) {logger.error("查询es数据异常:{}", e);}scrollId = searchResponse.getScrollId();searchHits = searchResponse.getHits().getHits();if (searchHits != null && searchHits.length > 0) {for (SearchHit searchHit : searchHits) {T t = JSONObject.parseObject(searchHit.getSourceAsString(), clazz);result.add(t);}}}// clean scrollClearScrollRequest clearScrollRequest = new ClearScrollRequest();clearScrollRequest.addScrollId(scrollId);ClearScrollResponse clearScrollResponse = null;try {clearScrollResponse = restHighLevelClient.clearScroll(clearScrollRequest, RequestOptions.DEFAULT);} catch (IOException e) {logger.error("清除scroll异常:{}", e);}boolean succeeded = clearScrollResponse.isSucceeded();if (succeeded) {return result;}return null;}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {restHighLevelClient = applicationContext.getBean(RestHighLevelClient.class);}
}
4. ES的乐观并发控制
- ES的文档是不可变更的。如果更新一个文档,会将文档标记为删除,同时增加一个全新的文档,同时文档的version字段加1
- 内部版本控制
- if_seq_no + if_primary_term
- 使用外部版本(其他数据库作为主要数据存储)
- version + version_type=external
代码示例:
PUT products
PUT products/_doc/1
{"title":"iphone","count":100
}
GET products/_doc/1
PUT products/_doc/1?if_seq_no=0&if_primary_term=1
{"title":"iphone","count":100
}
PUT products/_doc/1?version=30000&version_type=external
{"title":"iphone","count":100
}
欢迎关注公众号算法小生或沈健的技术博客
15.ElasticSearch系列之分布式特性及分布式搜索机制(四)相关推荐
- redis系列:基于redis的分布式锁
一.介绍 这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁.会从最原始的版本开始,然后根据问题进行调整,最后完成一个较为合理的分布式锁. 本篇文章会将分布式锁的实现分为两部分,一个是单机环境, ...
- springboot整合oracle_SpringBoot2.x系列教程67--Spring Boot整合分布式事务简介
SpringBoot2.x系列教程67--Spring Boot整合分布式事务简介 作者:一一哥 一. 分布式事务简介 1. 什么是分布式事务 百度百科对分布式事务的解释如下: 分布式事务就是指事务的 ...
- channelfuture怎么拿到数据_SpringBoot2.x系列教程66--Spring Boot整合分布式事务之数据库事务回顾
SpringBoot2.x系列教程66--Spring Boot整合分布式事务之数据库事务回顾 作者:一一哥 本节主要内容 一. 事务出现的原因 转账是生活中常见的操作,比如从A账户转账100元到B账 ...
- getprivateprofilestring读不到数据_SpringBoot2.x系列教程66--Spring Boot整合分布式事务之数据库事务回顾
SpringBoot2.x系列教程66--Spring Boot整合分布式事务之数据库事务回顾 作者:一一哥 本节主要内容 一. 事务出现的原因 转账是生活中常见的操作,比如从A账户转账100元到B账 ...
- MySQL高级特性之分布式(XA)事务的介绍
文章目录 分布式(XA) 事务 1.内部XA事务 2.外部XA事务 这一部分是 高性能MySQL(第3版)中第七章第11节内容:关于MySQL高级特性之分布式(XA)事务的介绍,(不感兴趣的可以忽略) ...
- SpringCloud技术指南系列(十五)分布式链路跟踪Sleuth与Zipkin实现
SpringCloud技术指南系列(十五)分布式链路跟踪Sleuth与Zipkin实现 一.概述 分布式链路追踪,是一种用于分析和监控应用程序的方法,尤其是那些使用微服务架构的那些应用.分布式链路跟踪 ...
- ElasticSearch系列 - SpringBoot整合ES:分析器
文章目录 01. ElasticSearch 分析器 1. ElasticSearch match 文本搜索的过程? 2. ElasticSearch 分析器是什么? 3. ElasticSearch ...
- 数据库事务、分布式一致性和分布式事务
文章目录 什么是事务 事务(ACID)的特性 对事务一致性的理解 分布式一致性 CAP BASE 分布式事务 本地事务 柔性事务和刚性事务 分布式一致性和分布式事务的理解 一致性协议 向量时钟 NWR ...
- Elasticsearch系列教程之ES介绍及与Solr对比
Elasticsearch介绍 ElasticSearch是一个开源的高拓展的分布式全文检索引擎,它可以近乎实时的存储.检索数据:本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据.es也使用 ...
最新文章
- 升值加薪Excel神助攻,数据透视表堪称神器!
- Ubuntu 删除dash 中无效的图标
- php 是面向对象编程,PHP面向对象编程快速入门
- php循环的应用案例,php for循环的实例分享
- cad2008加载 et拓展工具_CAD设计师的工具,55款实用插件,收藏起来
- 【JDBC】数据库连接池
- Python爬虫教程,利用Python采集QQ群成员信息
- chrome浏览器截长图
- 员工符合签订无固定期限劳动合同的条件,这种情况单位有权不予续签吗?
- 莫名奇妙的异常010:Unexpected server response (0) while retrieving PDF
- 手搓GPT系列之 - Logistic Regression模型,Softmax模型的损失函数与CrossEntropyLoss的关系
- Pro Android学习笔记(一五五) 传感器(5) 磁场传感器和方位(上)
- shell 编程--shell的扩展功能(字符串切割与掐头去尾)、通配符、设置语言字符集
- 中创|又临双11淘宝崩了,中心化存储难以支撑
- 网络安全学习第6篇 - 爆破及PE文件解释
- 物流快递电子面单Api接口怎么申请对接(顺丰、快递鸟、菜鸟、拼多多)
- 成也陈乔恩,败也东方不败【霍建华版《笑傲江湖》全剧评
- 内核参数强制显示器显示
- API入门系列之五 -一个正儿八经的SDK程序
- ie java被阻止_解决IE屏蔽Java Applet问题的方法
热门文章
- 基础知识夯实day10:Javabean
- 【技术解析笔记】DDPM解析
- send disconnect: Broken pipe SFTP 登录
- d3d透视逆向篇:第6课 通过特征码定位D3D函数入口地址
- 随机神经网络之玻尔兹曼机
- Cesium解决方案 绘制网格 绘制经纬度栅格
- CentOS7 运维 - 磁盘管理与文件系统 | 超详细 | 附挂载教程及错误排查 | parted超大磁盘分区教程
- python类型对象<class ‘type‘>的理解与探究
- 跑出数字化升级“加速度”,腾讯云启产业基地“长沙模式”的探索
- oracle备份数据脚本,oracle数据库自动备份脚本