首页 > 其他分享 >ES大数据量的分页查询

ES大数据量的分页查询

时间:2022-10-16 12:00:29浏览次数:47  
标签:users ## age 查询 分页 数据量 scroll ES size

FROM/SIZE分页查询

默认情况下,不加from,size的话,ES会返回前10条记录。加上from,size就会查询指定的条数。其中from代表起始行号,size代表查询行数。如果用JAVA等Client端传参时,要考虑该字段和分页查询的逻辑关系。
from = pageNum * pageSize-1,size = pageSize
ES的分页查询,最大支持10000条数据。from+size<10000
当需要查询数据量大于10000条时,我们要怎么查询呢?

Search After 避免深度分页的问题

  • search after 不支持指定页数(不能使用from,但是可以使用size),且只能往下翻
  • 第一步搜索需要指定sort,且保证值是唯一的
  • 然后下次请求时,需要使用上一次,最后一个文档的sort值进行查询
DELETE users

POST users/_bulk
{ "index" : {} }
  {"name":"user1","age":10}
{ "index" : {} }
  {"name":"user2","age":11}
{ "index" : {} }
  {"name":"user3","age":12}
{ "index" : {} }
  {"name":"user4","age":13}

GET users/_search
{
  "query": {
    "match_all": {}
  }
}

POST users/_search
{
    "size": 1,
    "query": {
        "match_all": {}
    },
    "sort": [
        {"age": "desc"} ,
        {"_id": "asc"}    
    ]
}
## 排序后的结果
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 4,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [
      {
        "_index" : "users",
        "_type" : "_doc",
        "_id" : "0lZTyoMBXQE6WXGyXiCa",
        "_score" : null,
        "_source" : {
          "name" : "user4",
          "age" : 13
        },
        "sort" : [
          13,
          "0lZTyoMBXQE6WXGyXiCa"
        ]
      }
    ]
  }
}


##下次再次查询时,带上上次排序的结果
POST users/_search
{
  "size": 1,
  "query": {
    "match_all": {}
  },
  "search_after": [
    13,
    "0lZTyoMBXQE6WXGyXiCa"
  ],
  "sort": [
    {
      "age": "desc"
    },
    {
      "_id": "asc"
    }
  ]
}

## 结果展示
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 4,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [
      {
        "_index" : "users",
        "_type" : "_doc",
        "_id" : "0VZTyoMBXQE6WXGyXiCa",
        "_score" : null,
        "_source" : {
          "name" : "user3",
          "age" : 12
        },
        "sort" : [
          12,
          "0VZTyoMBXQE6WXGyXiCa"
        ]
      }
    ]
  }
}

Scroll API

  • 查询的是一个快照数据,有新数据写入以后,无法被查到
  • 每次查询后,输入上一次的Scroll Id
  • scroll后边要跟上一个scroll查询上下文存活时间,比如5m
## 第一次查询
POST /users/_search?scroll=5m
{
    "size": 1,
    "query": {
        "match_all" : {
        }
    }
}

## 将上次的scroll_id 填入 scroll 查询
POST /_search/scroll
{
    "scroll" : "1m",
    "scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAADJcWbkhJVy0yNGtSQ0dRdU9UVkVtZU9VQQ=="
}
## 返回结果
{
  "_scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAADJcWbkhJVy0yNGtSQ0dRdU9UVkVtZU9VQQ==",
  "took" : 1,
  "timed_out" : false,
  "terminated_early" : true,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 6,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "users",
        "_type" : "_doc",
        "_id" : "0FZTyoMBXQE6WXGyXiCa",
        "_score" : 1.0,
        "_source" : {
          "name" : "user2",
          "age" : 11
        }
      }
    ]
  }
}


## 当我们再次插入一条数据
POST users/_doc
{"name":"user5","age":50}

## 再次执行上边scroll查询时,会发现最后到user4时后边就没有了,
## 也就是说快照里面没有刚刚添加的user5的数据

三种分页查询的使用场景

  • Regular

需要实时获取顶部的部分文档,例如查询最新的订单数据,不传分页参数,默认返回10条

  • Scroll

需要全部的文档,通过快照,遍历数据例如导出全部数据

  • Pagination

from 和 size
如果需要深度分页,则选用Search After

标签:users,##,age,查询,分页,数据量,scroll,ES,size
From: https://www.cnblogs.com/tenic/p/16795909.html

相关文章

  • ES的过滤查询
    ES的查询类型和特性查询(query):默认会计算每个返回文档的得分,然后根据得分排序过滤(filter):筛查出符合条件的文档,并且不计算得分,还可以缓存文档注意:filter过滤查询必须要......
  • ES聚合查询
    Elasticsearch的聚合查询分为四大类,分别是BucketAggregation、MetricAggregation、PipelineAggregation、MatrixAggregration。具体的四大类都是什么意思呢?都是怎么运......
  • ES中的DSL语句操作
    ES中的查询分为URISearch、RequestBodySearch。URISearch-在URL中使用查询参数。RequestBodySearch-使用JSON格式的入参作为查询条件。DSL语句就是基于Reques......
  • ES中的一些基本概念以及和关系数据库对比
    以下总结点为自己思路总结,有不正确地方,请斧正。ES中的基本概念一……索引索引:存放在ES中同一个类型文档的集合叫做ES中的索引,类似于关系数据库中的TableES中的基......
  • kubernetes学习笔记4-pod
    Pod资源定义​自主式pod资源,很少用到,手动创建的资源,用kubectldelete后不会自动创建,而使用pod控制器管理的才会按照用户期望的重新创建;​资源清单:一级字段(apiVersion|kind|m......
  • 绝杀processOn,这款UML画图神器,阿里字节都用疯了,你还不知道?
    大家好,我是陶朱公Boy,又和大家见面了。前言在文章开始前,想先问大家一个问题,大家平时在项目需求评审完后,是直接开始编码了呢?还是会先写详细设计文档,后再开始进行编码开发......
  • Pytest进阶使用
    fixture特点:命令灵活:对于setup,teardown可以省略数据共享:在conftest.py配置里写方法可以实现数据共享,不需要import导入,可以跨文件共享scope的层次及神奇的yield组......
  • 【解决】Intellij IDEA打开报错Caused by: java.net.BindException: Address already
    jetbrainsPyCharmWebStormcom.intellij.ide.plugins.StartupAbortedException:Cannotstartapp原因是IDEA需要在端口6942~6991间找到一个可用端口并绑定但目前这个......
  • Codeforces Global Round 23 题解
    ContestLink我是智障。A.MaxminaProblemLink显然当数组中全是\(0\)的时候,最后不可能变成\(1\),因为我们只有相邻取\(\min\)和区间取\(\max\)两种操作,并没有任......
  • Codeforces试题乱做 Part8
    搬机房的第一天.\(\text{[CF1270I]XoronFigures}\)\(\color{red}{\text{[HARD]}}\)为数不多的\(3500\)清新题.观察到这是个二维循环卷积的形式,考虑矩阵刻画.重......