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系列之分布式特性及分布式搜索机制(四)相关推荐

  1. redis系列:基于redis的分布式锁

    一.介绍 这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁.会从最原始的版本开始,然后根据问题进行调整,最后完成一个较为合理的分布式锁. 本篇文章会将分布式锁的实现分为两部分,一个是单机环境, ...

  2. springboot整合oracle_SpringBoot2.x系列教程67--Spring Boot整合分布式事务简介

    SpringBoot2.x系列教程67--Spring Boot整合分布式事务简介 作者:一一哥 一. 分布式事务简介 1. 什么是分布式事务 百度百科对分布式事务的解释如下: 分布式事务就是指事务的 ...

  3. channelfuture怎么拿到数据_SpringBoot2.x系列教程66--Spring Boot整合分布式事务之数据库事务回顾

    SpringBoot2.x系列教程66--Spring Boot整合分布式事务之数据库事务回顾 作者:一一哥 本节主要内容 一. 事务出现的原因 转账是生活中常见的操作,比如从A账户转账100元到B账 ...

  4. getprivateprofilestring读不到数据_SpringBoot2.x系列教程66--Spring Boot整合分布式事务之数据库事务回顾

    SpringBoot2.x系列教程66--Spring Boot整合分布式事务之数据库事务回顾 作者:一一哥 本节主要内容 一. 事务出现的原因 转账是生活中常见的操作,比如从A账户转账100元到B账 ...

  5. MySQL高级特性之分布式(XA)事务的介绍

    文章目录 分布式(XA) 事务 1.内部XA事务 2.外部XA事务 这一部分是 高性能MySQL(第3版)中第七章第11节内容:关于MySQL高级特性之分布式(XA)事务的介绍,(不感兴趣的可以忽略) ...

  6. SpringCloud技术指南系列(十五)分布式链路跟踪Sleuth与Zipkin实现

    SpringCloud技术指南系列(十五)分布式链路跟踪Sleuth与Zipkin实现 一.概述 分布式链路追踪,是一种用于分析和监控应用程序的方法,尤其是那些使用微服务架构的那些应用.分布式链路跟踪 ...

  7. ElasticSearch系列 - SpringBoot整合ES:分析器

    文章目录 01. ElasticSearch 分析器 1. ElasticSearch match 文本搜索的过程? 2. ElasticSearch 分析器是什么? 3. ElasticSearch ...

  8. 数据库事务、分布式一致性和分布式事务

    文章目录 什么是事务 事务(ACID)的特性 对事务一致性的理解 分布式一致性 CAP BASE 分布式事务 本地事务 柔性事务和刚性事务 分布式一致性和分布式事务的理解 一致性协议 向量时钟 NWR ...

  9. Elasticsearch系列教程之ES介绍及与Solr对比

    Elasticsearch介绍 ElasticSearch是一个开源的高拓展的分布式全文检索引擎,它可以近乎实时的存储.检索数据:本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据.es也使用 ...

最新文章

  1. 升值加薪Excel神助攻,数据透视表堪称神器!
  2. Ubuntu 删除dash 中无效的图标
  3. php 是面向对象编程,PHP面向对象编程快速入门
  4. php循环的应用案例,php for循环的实例分享
  5. cad2008加载 et拓展工具_CAD设计师的工具,55款实用插件,收藏起来
  6. 【JDBC】数据库连接池
  7. Python爬虫教程,利用Python采集QQ群成员信息
  8. chrome浏览器截长图
  9. 员工符合签订无固定期限劳动合同的条件,这种情况单位有权不予续签吗?
  10. 莫名奇妙的异常010:Unexpected server response (0) while retrieving PDF
  11. 手搓GPT系列之 - Logistic Regression模型,Softmax模型的损失函数与CrossEntropyLoss的关系
  12. Pro Android学习笔记(一五五) 传感器(5) 磁场传感器和方位(上)
  13. shell 编程--shell的扩展功能(字符串切割与掐头去尾)、通配符、设置语言字符集
  14. 中创|又临双11淘宝崩了,中心化存储难以支撑
  15. 网络安全学习第6篇 - 爆破及PE文件解释
  16. 物流快递电子面单Api接口怎么申请对接(顺丰、快递鸟、菜鸟、拼多多)
  17. 成也陈乔恩,败也东方不败【霍建华版《笑傲江湖》全剧评
  18. 内核参数强制显示器显示
  19. API入门系列之五 -一个正儿八经的SDK程序
  20. ie java被阻止_解决IE屏蔽Java Applet问题的方法

热门文章

  1. 基础知识夯实day10:Javabean
  2. 【技术解析笔记】DDPM解析
  3. send disconnect: Broken pipe SFTP 登录
  4. d3d透视逆向篇:第6课 通过特征码定位D3D函数入口地址
  5. 随机神经网络之玻尔兹曼机
  6. Cesium解决方案 绘制网格 绘制经纬度栅格
  7. CentOS7 运维 - 磁盘管理与文件系统 | 超详细 | 附挂载教程及错误排查 | parted超大磁盘分区教程
  8. python类型对象<class ‘type‘>的理解与探究
  9. 跑出数字化升级“加速度”,腾讯云启产业基地“长沙模式”的探索
  10. oracle备份数据脚本,oracle数据库自动备份脚本