ES查询优化—Scroll API 滚动查询

简介: ES查询优化—Scroll API 滚动查询

前言

ES的查询效率算是比较高的,但是from+size的分页查询方式只能查到一万条,并且随着分页到后面,执行效率越低。

Scroll滚动查询的方式可以查询大量数据,并能保证查询数据结果稳定。对于后台批量数据来说非常有用。

查询

第一次查询

第一次查询和通常的_search查询基本一致,只需要在后面加上?scroll=1m,1m代表一分钟,参考的时间格式如下

GET bbs/_search?scroll=1m
{
   "size": 200
}

返回结果除了和正常查询结果基本一致之外,增加了返回值_scroll_id

{
  "_scroll_id" : "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAFwRFnpvalZqbDZEVEFPQWptS0wyZjYzTXcAAAAAAABcEhZ6b2pWamw2RFRBT0FqbUtMMmY2M013AAAAAAAAXBMWem9qVmpsNkRUQU9Bam1LTDJmNjNNdwAAAAAAAFwUFnpvalZqbDZEVEFPQWptS0wyZjYzTXcAAAAAAABcFRZ6b2pWamw2RFRBT0FqbUtMMmY2M013",
  "took" : 6,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 5001,
    "max_score" : 1.0,
    "hits" : [
      {
(省略。。。。。。)

滚动请求

得到第一次请求的_scroll_id之后,就可以在设定的有效时间内,使用这个_scroll_id完成滚动查询。

GET /_search/scroll
{
  "scroll":"10m",
   "scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAFsTFnpvalZqbDZEVEFPQWptS0wyZjYzTXcAAAAAAABbFxZ6b2pWamw2RFRBT0FqbUtMMmY2M013AAAAAAAAWxQWem9qVmpsNkRUQU9Bam1LTDJmNjNNdwAAAAAAAFsVFnpvalZqbDZEVEFPQWptS0wyZjYzTXcAAAAAAABbFhZ6b2pWamw2RFRBT0FqbUtMMmY2M013"
}

滚动查询得到的结果和第一次请求的结果一致,返回的_scroll_id也是一致的

如果请求翻页的结果已经翻完,返回的结果也是一致的,只是hits里面没有数据了,可以根据这个判断数据已经刷完。

{
  "_scroll_id" : "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAF17FnpvalZqbDZEVEFPQWptS0wyZjYzTXcAAAAAAABdeRZ6b2pWamw2RFRBT0FqbUtMMmY2M013AAAAAAAAXXwWem9qVmpsNkRUQU9Bam1LTDJmNjNNdwAAAAAAAF16FnpvalZqbDZEVEFPQWptS0wyZjYzTXcAAAAAAABdfRZ6b2pWamw2RFRBT0FqbUtMMmY2M013",
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 5001,
    "max_score" : 1.0,
    "hits" : [ ]
  }
}

如果查询的_scroll_id已经超时,那么就会返回错误码

{
  "error" : {
    "root_cause" : [
      {
        "type" : "search_context_missing_exception",
        "reason" : "No search context found for id [24047]"
      },
      {
        "type" : "search_context_missing_exception",
        "reason" : "No search context found for id [24051]"
      },
      {
        "type" : "search_context_missing_exception",
        "reason" : "No search context found for id [24048]"
      },
      {
        "type" : "search_context_missing_exception",
        "reason" : "No search context found for id [24049]"
      },
      {
        "type" : "search_context_missing_exception",
        "reason" : "No search context found for id [24050]"
      }
    ],
    "type" : "search_phase_execution_exception",
    "reason" : "all shards failed",
    "phase" : "query",
    "grouped" : true,
    "failed_shards" : [
      {
        "shard" : -1,
        "index" : null,
        "reason" : {
          "type" : "search_context_missing_exception",
          "reason" : "No search context found for id [24047]"
        }
      },
      {
        "shard" : -1,
        "index" : null,
        "reason" : {
          "type" : "search_context_missing_exception",
          "reason" : "No search context found for id [24051]"
        }
      },
      {
        "shard" : -1,
        "index" : null,
        "reason" : {
          "type" : "search_context_missing_exception",
          "reason" : "No search context found for id [24048]"
        }
      },
      {
        "shard" : -1,
        "index" : null,
        "reason" : {
          "type" : "search_context_missing_exception",
          "reason" : "No search context found for id [24049]"
        }
      },
      {
        "shard" : -1,
        "index" : null,
        "reason" : {
          "type" : "search_context_missing_exception",
          "reason" : "No search context found for id [24050]"
        }
      }
    ],
    "caused_by" : {
      "type" : "search_context_missing_exception",
      "reason" : "No search context found for id [24050]"
    }
  },
  "status" : 404
}

清理scroll

我们可以主动清理scroll,释放es压力。

DELETE /_search/scroll
{
  "scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ=="
}

总结

优点

  • 可以查询大量数据
  • 稳定分页不会数据重复
  • 可以超出分页的一万条限制

缺点

  • 不能跨页请求
  • 不支持重试请求

参考资料

相关文章
|
2月前
|
安全 API 持续交付
要利用阿里云控制API查询您的阿里云资源
【2月更文挑战第33天】要利用阿里云控制API查询您的阿里云资源
30 3
|
2月前
|
缓存 API 定位技术
使用Python调用百度地图API实现地址查询
使用Python调用百度地图API实现地址查询
124 0
|
5月前
|
Java API
java 操作es api
java 操作es api
47 0
|
15天前
|
存储 缓存 运维
DataWorks操作报错合集之DataWorks根据api,调用查询文件列表接口报错如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
23 1
|
17天前
|
缓存 前端开发 JavaScript
【专栏】GraphQL,Facebook 开发的API查询语言,正在前端开发中崭露头角
【4月更文挑战第27天】GraphQL,Facebook 开发的API查询语言,正在前端开发中崭露头角。它提供强类型系统、灵活查询和实时更新,改善数据获取效率和开发体验。掌握GraphQL涉及学习基础概念、搭建开发环境和实践应用。结合前端框架,利用缓存和批量请求优化性能,与后端协作设计高效API。尽管有挑战,但GraphQL为前端开发开辟新道路,引领未来趋势。一起探索GraphQL,解锁前端无限可能!
|
19天前
|
API 数据库
工作流JBPM操作API启动实例&查询任务
工作流JBPM操作API启动实例&查询任务
15 0
|
5月前
|
API
item_search_coupon-优惠券查询API接口有哪些错误代码或异常可以处理?
item_search_coupon-优惠券查询API接口可能会返回一些错误代码或异常,以指示在请求或响应过程中出现的问题。以下是一些可能的错误代码或异常:
|
6月前
|
运维 数据可视化 API
利用标签平台创建群组并通过API查询群组数据
Dataphin的标签平台提供了 丰富强大的标签加工能力,支持多种类型标签开发,包括离线、实时等标签可视化加工。基于离线视图、实时视图、行为关系,可通过配置化的方式构建属性类、统计类标签、偏好类标签,以及与已有的标签创建衍生组合标签。通过构建及管理标签,形成良好的标签资产,可供上层的应用及业务系统使用。本文将介绍如何通过Dataphin OpenAPI圈选群组以及群组分页查询服务,让应用系统集成标签平台的标签及群组加工能力,进行群组的圈选、分析及投放。
131 0
|
9月前
|
XML JSON 缓存
Java实现天眼查API根据企业纳税识别号查询企业详情数据方法
Java实现天眼查API根据企业纳税识别号查询企业详情数据方法
398 0
|
10月前
|
存储 数据采集 JavaScript
php对接阿里云API调用企业税号查询的高级实战案例解析(下拉筛选查询、远程调用API、xm-select组件应用)
php对接阿里云API调用企业税号查询的高级实战案例解析(下拉筛选查询、远程调用API、xm-select组件应用)
461 31