正版包邮elasticsearch实战与原理

70.1元

包邮

(需用券)

去购买 >

elasticsearch分页对于用过es的人应该都会使用 ,和数据库的分页类似,如下所示,通过from + size可以对数据进行分页。

{

"from" : 0,

"size" : 10,

"query" : {

"term" : { "user" : "dejun" }

}

}

可以查询1-10条记录,不过由于es是分布式的,数据都是分布在多个分片上。

如查询: from = 990 , size = 10 , 分片数为:4 ,那么es是如何 查询的呢? 如下图所示:

es会在每个分片获取1000条文档,通过Coordinating Node 汇总各个节点的数据,再通过排序选择前1000个文档返回。

所以当页数越深,查询的节点的数量越大,自然占用的内存也越多,那么我们是不是可以把系统内存查爆? ES为了避免深度分页带来的内存开销,ES默认限定只能查询10000个文档

那么我们做个示范:

POST /demo/_search

{

"from" : 0 ,

"size" : 10001 ,

"query" : {

"match_all":{}

}

}

ES会报以下错误:

Result window is too large, from + size must be less than or equal to: [10000] but was [10001]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level parameter.

以上可见,from + size 这种方式不适用于深度分页场景,下面介绍其它两种分页方式…

Search After

Scroll Api

Search After

可以避免深度分页带来的性能问题,可以实时的获取下一页文档

不支持指定页数,只能向下翻

需要加入排序 sort,并且排序的字段一定要是唯一的

示例:

POST /demo/_search

{

"size": 3,

"query": {

"terms": {

"txAcctNo": ["11111"

]

}

},

"sort" :{

"_id" :"desc"

}

}

ES返回:

{

"took": 110,

"timed_out": false,

"_shards": {

"total": 5,

"successful": 5,

"skipped": 0,

"failed": 0

},

"hits": {

"total": 1122,

"max_score": null,

"hits": [

{

"_id": "6140202001021427303890174574324",

"_score": null,

"_source": {

},

"sort": [

"6140202001021427303890174574324"

]

},

{

"_id": "6140201912131352403980169574091",

"_score": null,

"_source": {

},

"sort": [

"6140201912131352403980169574091"

]

},

{

"_id": "6140201912101038085680169566509",

"_score": null,

"_source": {

},

"sort": [

"6140201912101038085680169566509"

]

}

]

}

}

每条数据都会有一个sort返回,只需要在下一次查询中,在search_after中加入这个值,如下:

POST /demo/_search

{

"size": 3,

"query": {

"terms": {

"txAcctNo": ["11111"

]

}

},

"sort" :{

"_id" :"desc"

},

"search_after" :[

"6140202001171118484170182578541"

]

}

以上即是search_after的用法,其实很简单,那么为什么search_afterr适合深度分页呢,来看一下原理:

假设size:10 ,查询10000-10010,search_after会通过唯一排序的值定位,每个节点只会查10条数据,避免了内存开销过大的问题

java 11官方入门(第8版)教材

79.84元

包邮

(需用券)

去购买 >

elasticsearch java 分页查询_elasticsearch深度分页问题相关推荐

  1. ElasticSearch 分页查询及深度分页原理与实现

    查询流程 查询阶段 在初始化查询阶段(query phase),查询被向索引中的每个分片副本(原本或副本)广播.每个分片在本地执行搜索并且建 立了匹配 document 的优先队列(priority ...

  2. ElasticSearch利用Search After解决深度分页问题

    ElasticSearch利用Search After解决深度分页问题 1.ElasticSearch常见分页 2.ElasticSearch深度分页问题 3.ElasticSearch深度分页问题的 ...

  3. mybatis 分页查询_MyBatis之分页查询:MyBatis PageHelper

    MyBatis,作为目前流行的ORM框架,大大方便了日常开发.而对于分页查询,虽然可以通过SQL的limit语句实现,但是比较繁琐.而MyBatis PageHelper的出现,则解决了这一痛点.这里 ...

  4. java oracle分页查询语句_oracle分页查询语句,java得到分页查询语句的方法

    oracle分页查询语句 select * from ( select a.*, rownum rn from (select * from table_name) a where rownum &l ...

  5. java mybatis分页查询语句_mybatis分页查询的实现(一)

    一.总结了mybatis中五种不同实现分页查询的方法 UserMapper.java接口文件 public interface UserMapper { //分页查询 public List sele ...

  6. java oracle数据库高效分页查询_oracle高效分页查询总结

    探索查询语句: --分页参数:size = 20 page = 2 --没有order by的查询 -- 嵌套子查询,两次筛选(推荐使用) --SELECT * -- FROM (SELECT ROW ...

  7. java分页查询_java实现分页查询

    1.基本思路 我现阶段的分页查询的实现是基于sql语句的. select * from user where id limit a, b 构造出相应的a和b就可以查询出想要的数据,在显示在页面上.重点 ...

  8. java oracle分页查询语句_Oracle分页查询语句的写法(转)

    Oracle分页查询语句使我们最常用的语句之一,下面就为您介绍的Oracle分页查询语句的用法,如果您对此方面感兴趣的话,不妨一看. Oracle分页查询语句基本上可以按照本文给出的格式来进行套用. ...

  9. mybatis实现分页查询-自己封装分页方法

    大致结构如下: 一.定义返回数据结构 创建返回数据结构主要是为了统一方便,和分页查询的关系并不大,也可以忽略这一步. package boc.ljh.config;import io.swagger. ...

最新文章

  1. 不断的困惑:为什么我仍然使用JavaScript函数语句
  2. 2.使用Connection对象连接数据库
  3. Eclipse中SVN的安装步骤(两种)和用法
  4. 分布式架构的演进过程
  5. Dotnet的数据定位和匹配
  6. flask manage port_后端Python3+Flask结合Socket.io配合前端Vue2.0实现简单全双工在线客服系统...
  7. 【C语言】用指针描述数组,实现选择法排序
  8. 故障诊断:SLES12平台数据库启动失败ORA-27300
  9. xampp安装后无法启动apache
  10. VOC标签转化为YOLO标签
  11. linux oracle异常,Linux上oracle常见安装异常总结
  12. 李雅普诺夫稳定性理论
  13. android设置闹钟日期,具有特定日期的Android闹钟设置
  14. Candidate是什么
  15. 论文阅读:Instance Weighting in Dialogue Systems
  16. high sierra php,關於macOS High Sierra 10.13 中,XAMPP php7 安裝memcache的問題
  17. 游戏应用市场APP软件下载平台网站源码+手机版
  18. 备份onetab数据
  19. css:网页引入字体@font-face以及动态加载字体
  20. java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解

热门文章

  1. 基于持久层框架hibernate用SpringMVC增删功能
  2. Android 12原生设计曝光,Android 12原生设计曝光 网友看了惊呼神似iOS
  3. ios 高德地图加载瓦片地图_OpenLayers加载谷歌地球离线瓦片地图
  4. 米奇emoji_一些常用的 Emoji 符号(可直接复制)
  5. php设计模式-责任链模式
  6. Python3 不能直接导入reduce
  7. 第四章 选择结构(二)
  8. mysql 慢查询日志记录
  9. VB之Collection---Collection集合类
  10. ASP网页中 制作连续无缝滚动文字