前面说到,分页可以使用from和size参数,类似于mysql的分页offset和limit。但是如果数据量比较大时,elasticsearch会对分页做出限制,因为此时会比较消耗性能。

为什么要限制

分页的时候,elasticsearch会根据查询条件到每个分片取出数据来,然后再由coordinate节点来处理数据每个分片获取来的数据。整个行为远比mysql根据索引来查询数据耗时的多。所以elasticsearch就限制了大量数据的分页行为

把限制放大一些

es中有个设置index.max_result_window,默认是10000条数据,如果分页的数据超过第1万条,就拒绝返回结果了。如果你觉得自己的集群还算可以,可以适当的放大这个参数,比如100万。

我就是想一下子查第200万条的数据

目前没有解决方案,建议在业务上控制。示例可见百度、google搜索的做法。

我需要查询大批量的数据

elasticsearch满足你无限的查询下一页的操作,也就是一页一页的翻页行为。

search after

满足实时获取下一页的文档信息

search_after 分页的方式是根据上一页的最后一条数据来确定下一页的位置,同时在分页请求的过程中,如果有索引数据的增删改查,这些变更也会实时的反映到游标上。

为了找到每一页最后一条数据,每个文档必须有一个全局唯一值,官方推荐使用 _uid 作为全局唯一值,其实使用业务层的 id 也可以

  1. GET test_dev/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "filter": [
  6. {
  7. "term": {
  8. "age": 28
  9. }
  10. }
  11. ]
  12. }
  13. },
  14. "size": 20,
  15. "from": 0,
  16. "sort": [
  17. {
  18. "timestamp": {
  19. "order": "desc"
  20. },
  21. "_id": {
  22. "order": "desc"
  23. }
  24. }
  25. ]
  26. }

使用sort返回的值搜索下一页

  1. GET test_dev/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "filter": [
  6. {
  7. "term": {
  8. "age": 28
  9. }
  10. }
  11. ]
  12. }
  13. },
  14. "size": 10,
  15. "from": 0,
  16. "search_after": [
  17. 1541495312521,
  18. "d0xH6GYBBtbwbQSP0j1A"
  19. ],
  20. "sort": [
  21. {
  22. "timestamp": {
  23. "order": "desc"
  24. },
  25. "_id": {
  26. "order": "desc"
  27. }
  28. }
  29. ]
  30. }

scroll

生成一个快照,适合批量导出数据

使用scroll,每次只能获取一页的内容,然后会返回一个scroll_id。根据返回的这个scroll_id可以不断地获取下一页的内容

  1. GET test_dev/_search?scroll=5m
  2. {
  3. "query": {
  4. "bool": {
  5. "filter": [
  6. {
  7. "term": {
  8. "age": 28
  9. }
  10. }
  11. ]
  12. }
  13. },
  14. "size": 10,
  15. "from": 0,
  16. "sort": [
  17. {
  18. "timestamp": {
  19. "order": "desc"
  20. },
  21. "_id": {
  22. "order": "desc"
  23. }
  24. }
  25. ]
  26. }
  • scroll=5m表示设置scroll_id保留5分钟可用。
  • 使用scroll必须要将from设置为0。
  • size决定后面每次调用_search搜索返回的数量
  1. GET _search/scroll
  2. {
  3. "scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAJZ9Fnk1d......",
  4. "scroll": "5m"
  5. }

参考 https://blog.csdn.net/andybegin/article/details/83864171

8.解决elasticsearch深度分页问题的更多相关文章

  1. elasticsearch深度分页问题

    elasticsearch专栏:https://www.cnblogs.com/hello-shf/category/1550315.html 一.深度分页方式from + size es 默认采用的 ...

  2. ElasticSearch深度分页详解

    1 前言 ElasticSearch是一个实时的分布式搜索与分析引擎,常用于大量非结构化数据的存储和快速检索场景,具有很强的扩展性.纵使其有诸多优点,在搜索领域远超关系型数据库,但依然存在与关系型数据 ...

  3. ElasticSearch 深度分页解决方案 {"index":{"number_of_replicas":0}}

    常见深度分页方式 from+size es 默认采用的分页方式是 from+ size 的形式,在深度分页的情况下,这种使用方式效率是非常低的,比如 from = 5000, size=10, es ...

  4. ElasticSearch 深度分页解决方案

    常见深度分页方式 from+size 另一种分页方式 scroll scroll + scan search_after 的方式 es 库 scroll search 的实现 常见深度分页方式 fro ...

  5. SpringBoot 整合 Elasticsearch深度分页查询

    es 查询共有4种查询类型 QUERY_AND_FETCH: 主节点将查询请求分发到所有的分片中,各个分片按照自己的查询规则即词频文档频率进行打分排序,然后将结果返回给主节点,主节点对所有数据进行汇总 ...

  6. Elasticsearch深度应用(下)

    Query文档搜索机制剖析 1. query then fetch(默认搜索方式) 搜索步骤如下: 发送查询到每个shard 找到所有匹配的文档,并使用本地的Term/Document Frequer ...

  7. 大数据学习[16]--使用scroll实现Elasticsearch数据遍历和深度分页[转]

    题目:使用scroll实现Elasticsearch数据遍历和深度分页 作者:星爷 出处: http://lxWei.github.io/posts/%E4%BD%BF%E7%94%A8scroll% ...

  8. 【分页问题】elasticsearch 深分页问题以及解决方法

    本文主要参考: 1.https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html ...

  9. Elasticsearch 在分布式系统中深度分页问题

    理解为什么深度分页是有问题的,我们可以假设在一个有 5 个主分片的索引中搜索. 当我们请求结果的第一页(结果从 1 到 10 ),每一个分片产生前 10 的结果,并且返回给 协调节点 ,协调节点对 5 ...

  10. elasticserach数据库深度分页查询的原理

    深度分页存在的问题 https://segmentfault.com/a/1190000019004316?utm_source=tag-newest 在实际应用中,分页是必不可少的,例如,前端页面展 ...

随机推荐

  1. Vue-基本语法及事件绑定

    一.基本语法 v-bind绑定: 双大括号不能在 HTML attributes 中使用.想要响应式地绑定一个 attribute,应该使用 v-bind 指令 代码展示: <div id=&q ...

  2. Nearest cluster-based intrusion detection through convolutional neural networks 笔记

    Nearest cluster-based intrusion detection through convolutional neural networks 技术要点 So, the primary ...

  3. 2020 ICPC 南京站

    gym A. Ah, It's Yesterday Once More 有趣的题,但场上的人恐怕不会这么想( 构造一条长路径,且拐弯处在不同边界.这样每条竖线合并后都在一边,还需要走一遍才能合并到一起 ...

  4. Redis系列之——Redis-Sentinel

    文章目录 一 主从复制高可用 二 架构说明 三 安装配置 四 客户端连接 一 主从复制高可用 #主从复制存在的问题: #1 主从复制,主节点发生故障,需要做故障转移,可以手动转移:让其中一个slave ...

  5. Go基础之变量和常量

    Go基础之变量和常量 目录 Go基础之变量和常量 一. 标识符.关键字.内置类型和函数 1.1 标识符 1.2 关键字 1.3 保留字 1.4 内置类型 1.4.1 值类型: 1.4.2 引用类型:( ...

  6. How to Install Bugzilla on Ubuntu 20.04

    In this blog post, we are going to explain in step-by-step detail on how to install Bugzilla on Ubun ...

  7. 算法修养--广度优先搜索BFS

    广度优先算法(BFS) 广度优先算法(Breadth-First Search)是在图和树领域的搜索方法,其核心思想是从一个起始点开始,访问其所有的临近节点,然后再按照相同的方式访问这些临近节点的节点 ...

  8. 【matplotlib 实战】--南丁格尔玫瑰图

    南丁格尔玫瑰图是一种用极坐标下的柱状图或堆叠柱状图来展示数据的图表. 虽然南丁格尔玫瑰图外观类似饼图,但是表示数据的方式不同,它是以半径来表示数值的,而饼图是以扇形的弧度来表达数据的. 所以,南丁格尔 ...

  9. 我试图扯掉这条 SQL 的底裤。

    你好呀,我是歪歪. 这次带大家盘一个我觉得有点意思的东西,也是之前写<一个烂分页,踩了三个坑!>这篇文章时,遇到的一个神奇的现象,但是当时忙着做文章搞定这个主线任务,就没有去深究这个支线任 ...

  10. docker 分离engine和client

    背景 由于我个人电脑是2020款m1,16G,256G.一方面,平时除了运行多个浏览器,还有coding 编辑器等等,内存确实很紧张.其次呢,m1 是ARM的架构,所以构建的镜像是无法在X86的机器上 ...