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=="
}

总结

优点

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

缺点

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

参考资料

相关文章
|
3月前
|
JSON 自然语言处理 搜索推荐
银行卡归属地及开户行查询API查询实战指南
银行卡归属地及开户行查询API,通过卡号快速识别发卡行、开户地及卡种信息,支持全国1500+银行,数据实时更新。提供结构化数据返回,广泛应用于支付、风控、用户画像等场景,助力金融系统高效、安全运行。
1127 5
|
2月前
|
移动开发 算法 API
淘宝/天猫:使用物流查询API实时显示包裹位置,减少客服咨询量
电商平台中物流咨询占客服工作40%以上,用户频繁追问包裹位置。本文介绍通过物流查询API实现包裹实时追踪,降低75.6%咨询量,提升用户体验与复购率,助力降本增效。(238字)
365 0
|
2月前
|
人工智能 JSON API
淘宝/天猫:使用物流查询API实时显示包裹位置,减少客服咨询量
在电商竞争激烈的环境下,淘宝、天猫通过集成物流查询API,实现实时追踪包裹位置,显著减少用户咨询量。本文解析其原理、实现步骤与效益,展示如何以技术手段提升用户体验、降低客服压力,助力平台高效运营。(238字)
288 0
|
2月前
|
监控 安全 算法
快递查询API|一次接通2700+快递服务商的物流轨迹
在物流数字化的浪潮中,企业对接多家快递服务商的痛点日益凸显:每新增一家合作物流商,技术团队就要投入 5-7 个工作日进行接口开发,不同服务商的接口协议差异导致系统稳定性差,物流轨迹数据分散在各平台难以整合分析。快递鸟快递查询 API 通过标准化接口架构,创新性地实现了 2700 + 国内外快递服务商的一键接入,将传统模式下的周级开发周期压缩至小时级,彻底重构了物流数据对接的技术范式。
221 0
|
2月前
|
人工智能 API
阿里云百炼API-KEY在哪查询?如何获取阿里云AI百炼大模型的API-KEY?
阿里云百炼是阿里云推出的AI大模型平台,用户可通过其管理控制台获取API-KEY。需先开通百炼平台及大模型服务,即可创建并复制API-KEY。目前平台提供千万tokens免费额度,详细操作流程可参考官方指引。
|
2月前
|
JSON 前端开发 API
汽车配件:使用VIN码查询API精准匹配车型配件,提升用户信任
VIN码是汽车的唯一“身份证”,通过API可精准解析车型信息,实现配件99.5%以上匹配度。本文详解VIN码API的工作流程、技术实现与信任提升价值,助力汽配销售从经验判断迈向数据驱动,降低退货率,提升用户体验与复购。
503 0
|
2月前
|
JSON 监控 API
Minecraft(我的世界)服务器信息查询免费API接口详解
本文介绍接口盒子提供的免费Minecraft服务器查询API,涵盖参数说明、返回解析及PHP/Python调用示例,助您快速集成服务器监控功能。
|
3月前
|
数据采集 自然语言处理 API
信息一键收集:新闻查询API的核心功能和技术实现
在信息爆炸时代,新闻查询API通过程序化访问聚合新闻数据源,提供实时、结构化的新闻内容服务,助力开发者构建智能化信息解决方案。
451 2
|
3月前
|
JSON API 定位技术
公交线路站点查询API接口详解:免费获取全国公交路线数据
公交线路站点查询API提供全国公交数据,支持线路编号查询路线、站点、票价及运营时间。具备GET/POST请求方式,免费调用,适用于公交App、智慧交通及地图导航等场景。
|
2月前
|
JSON 监控 API
淘宝/天猫:使用订单查询API实时追踪包裹状态,自动推送物流通知至用户
在淘宝/天猫平台,通过集成订单查询API实现物流状态实时监控,结合定时轮询与自动推送通知功能,可有效减少用户频繁刷新页面,提升购物体验。本文详解API调用原理、状态判断及Python代码实现,助力开发者构建高效、智能的物流通知系统。
287 0
下一篇
oss云网关配置