Elasticsearch7.x DSL语法之分页查询_程序员小强的博客-程序员信息网_dsl 分页

技术标签: ElasticSearch  elasticsearch  dsl  

程序员小强总结的 ElasticSearch专题超全总结篇在这里:传送门
结合官网资料,做了更详细的实际使用总结。
从单机版安装到集群高可用生产环境搭建、基本概念(索引,分片,节点,倒排索引…)、DSL语法实践、分词器(内置+中文)、SpringBoot整合实战、仿京东商品搜索实战实现。

1.简单分页

对于非深度分页,简单查询时,一般使用from和size进行分页查询

  • “from”: 分页起始位置
  • “size”: 每页数据大小

1.1写法

GET /student_info/_search
{
    
  "query": {
    
    "match_all": {
    }
  },
  "from": 1,
  "size": 2
}

常见问题:深分页问题,效率会很低,尽量避免深分页。

1.2深度分页问题

ES对于from+size的个数也是有限制的,默认限制二者之和不能超过1w。超过后会报错,
使用index.max_result_window:10000作为保护措施,虽然这个参数可以修改,也可以在配置文件配置。
但是最好不要这么做,当所请求的数据总量大于1w时,应用ES游标(scroll查询)来代替from+size。如果需要深度分页对服务器压力会变大。如果确认需要设置,则需要提前预估启动内存大小。
在这里插入图片描述

深分页举例

  • 比如每页100条,当要查询第100页也就是9900 ~ 10000数据时,若是去5个节点查询,那么每个节点查到这个区间的数据,然后汇总并排序后再取9900 ~ 10000之间的数据,非常消耗资源,而且有OOM的风险。

2.游标查询(scoll)

scoll 游标查询,指定 scroll=时间 ,指定保存的分钟数,
第一次发起请求放回的是数据+_scroll_id ,后面通过 _scroll_id 去请求数据,适合大批量查询。

#游标查询-年龄> 18,每页2条,保存1分钟
GET /student_info/_search?scroll=1m
{
    
  "query": {
    
    "range": {
    
      "age":{
    
        "gt": 18
      }
    }
  },
  "size": 2
}

在这里插入图片描述

游标查询,其实是在 es 里面缓存了结果 ,然后一次一次的去取,所以发起第一次请求的时候只有 size ,没有from,后面的请求只有 scroll_id 和 scroll 时间

GET /_search/scroll
{
    
    "scroll": "1m",
    "scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAABZxIWYzcxTVZWN1BRd1NpUzg4WHg1RkYzZw=="
}

在这里插入图片描述
在这里插入图片描述

3.search_after分页

  • from + size的分页方式虽然是最灵活的分页方式,但当分页深度达到一定程度将会产生深度分页的问题。
  • scroll能够解决深度分页的问题,但是其无法实现实时查询,即当scroll_id生成后无法查询到之后数据的变更,因为其底层原理是生成数据的快照。
  • ES-5.X之后 search_after应运而生

使用search_after必须添加排序"sort"条件
如下示例:指定了根据ID升序,年龄倒叙,2个排序条件,search_after中[起始ID,起始年龄]

GET /student_info/_search
{
    
  "query": {
    
    "match_all": {
    }
  },
  "search_after": [
    11000,20
  ],
  "size": 2,
   "sort": [
        {
    "_id": "asc"},
        {
    "age": "desc"}
    ]
}

请求第一页的时候,会返回sort 值,下一页的时候,把上一页 sort的值带入查询参数 search_after中
在这里插入图片描述
在这里插入图片描述

4.三种分页方式比较

分页方式 性能 优点 缺点 使用场景
from + size 灵活性好,实现简单 深度分页问题 数据量比较小,能容忍深度分页问题
scroll 解决了深度分页问题 无法反应数据的实时性维护成本高,需要维护一个 scroll_id跳页查询问题 海量数据的导出需要查询海量结果集的数据
search_after 性能最好不存在深度分页问题能够反映数据的实时变更 实现复杂,需要有一个全局唯一的字段连续分页的实现相对复杂,因为每一次查询都需要上次查询的结果跳页查询问题 海量数据的分页

5.总结**

  • Scroll 被推荐用于深度查询,但是代价是昂贵的,不推荐用于实时用户请求,而更适用于后台批处理任务,比如非实时导出或群发。
  • search_after 提供了实时的光标来避免深度分页的问题,其实现方式是使用前一页的结果来帮助检索下一页。
  • search_after不能自由跳到一个随机页面,只能按照 sort values 跳转到下一页,需要使用一个唯一值的字段作为排序字段,推荐使用_id 作为唯一值的排序字段
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_38011415/article/details/111863289

智能推荐

flutter 开发踩坑集_Cao_Shixin攻城狮的博客-程序员信息网

一、TextField设置高度后,文字无法居中解决方案:TextField( style: TextStyle( ), decoration: InputDecoration( prefixIcon: ImageUtils.getImage("search")/*Icon(Icons.search)*/, hintText: widget.hint, fillColor: Color(0x.

python pycryptodome_python AES加密解密 pycryptodome_MollyBox魔力猫盒的博客-程序员信息网

环境 pyhton3.6pip 升级到10.0以上,,不然可能出现装不上的可能。博主为了解码 AES 用了1天的时间,安了各种包,然而走了很多坑,在这里给大家提供一个简便的方法首先在命令行(推荐) pip installCrypto你会发现安装下来的包名 是小写的。(crypto)包的路径在你python/lib/site_packages下必须先改成大写 (Crypto)然而导入 ...

Struts2学习笔记(二):Action 的三种开发模式_秋忆夏伤的博客-程序员信息网_action模式

项目结构:UserAction.java:/** * Action 的开发模式1:继承 ActionSupport 类; * 如果使用 struts 的数据校验功能,必须继承 ActionSupport; */public class UserAction extends ActionSupport { /** * Action 中业务处理方法 ...

Cocos2d-x学习之创建Android工程和编译_weixin_33881753的博客-程序员信息网

2019独角兽企业重金招聘Python工程师标准>>> ...

A. 实验11_4_初识链表_ヾ Hushつ的博客-程序员信息网

题目描述问题描述:已知一个正整数序列,个数未知,但至少有一个元素,你的任务是建立一个单链表,并使用该链表存储这个正整数序列,然后统计这个序列中元素的最大值与最小值,计算序列全部元素之和。正整数的输入用-1作为结束标志,注意-1不算这个正整数序列中的元素(不要统计-1)。输入与输出要求:输入一个正整数序列,正整数序列元素的个数未知,但以输入“-1”结束,输入“-1”前至少输入一个正整数。序列中...

随便推点

时间序列分析之ARIMA模型预测__R篇_知之可否的博客-程序员信息网

转自http://www.cnblogs.com/bicoffee/p/3838049.html之前一直用SAS做ARIMA模型预测,今天尝试用了一下R,发现灵活度更高,结果输出也更直观。现在记录一下如何用R分析ARIMA模型。 1. 处理数据1.1. 导入forecast包forecast包是一个封装的ARIMA统计软件包,在默认情况下,R没有预装fore

【程序员必修数学课】->基础思想篇->递归(上)->泛化数学归纳__为光的博客-程序员信息网

递归前言如何在限定总和的条件下求加和?迭代法递归法前言在前几篇文章中我不断引用更改了国际象棋发明人被国王赏麦子的故事,这篇文章我还需要再借一下这两个人。舍罕王和宰相达依尔来到了现代,这次舍罕王聪明了,他对宰相说,“这次我不用麦子赏你了,我直接给你发钱。另外,我也不用棋盘了,我直接给你一大笔固定数额的钱。”宰相思考了一下,回答道:“没问题,陛下,就按照您的意愿。不过,我有一个小小的要求。能...

The Singularity Is Near(奇点临近)阅读笔记----六大纪元_云深林深的博客-程序员信息网

奇点( Singularity)表示独特的时间以及种种奇异的影响。数学家用这个词表示一个超越了任何限制的值,如除以一个越来越趋近于零的数,其结果将激增。如y=1/x,随着x的值趋近于零,其对应的函数(Y)的值将激增。 这样的数学函数实际上从未到过无限的值,因为除以零是数学上的“未定义”(无法计算的)。但是,因为除数x趋近于零,y的值超过任何的限制(趋于无穷大)。 在天体物理学中,如果一个大质量恒

【前端】easyUI可编辑行(年-月格式)日期输入控件的实现_扣钉的博客-程序员信息网

背景:项目中,用datagrid的可编辑行实现对业务信息的录入其中包括日期字段的录入在以往的开发中常常见到的是这种(easyUI日期输入框):<input class="easyui-datebox"id="xxx" name="xxx" required="true"/>既非可编辑行的日期控件和这种(datagrid日期输入框):&lt...

java json merge_java.lang.NoClassDefFoundError: com/fasterxml/jackson/annotation/JsonMerge_古德猫的靴子的博客-程序员信息网

Run a Jackson related project and hits the following JsonMerge not found error.Consolejava.lang.NoClassDefFoundError: com/fasterxml/jackson/annotation/JsonMergeat com.fasterxml.jackson.databind.intros...

Python脚本运行出现语法错误:IndentationError: unindent does n_chuanping7294的博客-程序员信息网

【问题】一个python脚本,本来都运行好好的,然后写了几行代码,而且也都确保每行都对齐了,但是运行的时候,却出现语法错误:IndentationError: unindent does not match any outer indentation level 【解决过程】1.对于此...

推荐文章

热门文章

相关标签