首页 > 其他分享 >elasticsearch 查询超10000的几种解决方案

elasticsearch 查询超10000的几种解决方案

时间:2023-04-08 10:33:52浏览次数:45  
标签:index 10000 解决方案 游标 id elasticsearch demo scroll size

在es中,默认查询的 from + size 数量不能超过一万,官方对于超过1万的解决方案使用游标方案,今天介绍下几种方案,希望对你有用。

数据准备,模拟较大数据量,往es中灌入60w的数据,其中只有2个字段,一个seq,一个timestamp,如下图:

方案1:scroll 游标

游标方案中,我们只需要在第一次拿到游标id,之后通过游标就能唯一确定查询,在这个查询中通过我们指定的 size 移动游标,具体操作看看下面实操。

kibana

# 查看index的settings
GET demo_scroll/_settings
---
{
  "demo_scroll" : {
    "settings" : {
      "index" : {
        "number_of_shards" : "5",
        "provided_name" : "demo_scroll",
        "max_result_window" : "10000", # 窗口1w
        "creation_date" : "1680832840425",
        "number_of_replicas" : "1",
        "uuid" : "OLV5W_D9R-WBUaZ_QbGeWA",
        "version" : {
          "created" : "6082399"
        }
      }
    }
  }
}
---

# 查询 from+size > 10000 的
GET demo_scroll/_search
{
  "sort": [
    {
      "seq": {
        "order": "desc"
      }
    }
  ],
  "from": 9999,
  "size": 10
}
---
{
  "error": {
    "root_cause": [
      {
        "type": "query_phase_execution_exception",
        "reason": "Result window is too large, from + size must be less than or equal to: [10000] but was [10009]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level setting."
      }
    ],
    "type": "search_phase_execution_exception",
    "reason": "all shards failed",
    "phase": "query",
    "grouped": true,
    "failed_shards": [
      {
        "shard": 0,
        "index": "demo_scroll",
        "node": "7u5oEE-kSoqXlxEHgDZd4A",
        "reason": {
          "type": "query_phase_execution_exception",
          "reason": "Result window is too large, from + size must be less than or equal to: [10000] but was [10009]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level setting."
        }
      }
    ]
  },
  "status": 500
}
---

# 游标查询,设置游标有效时间,有效时间内,游标都可以使用,过期就不行了
GET demo_scroll/_search?scroll=5m
{
  "sort": [
    {
      "seq": {
        "order": "desc"
      }
    }
  ],
  "size": 200
}

上面操作中通过游标的结果返回:

复制_scroll_id到查询窗口中:

GET _search/scroll
{
  "scroll":"5m",
  "scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAGc2DFndkTUUwTU9jVFBTZ1lHaVZWMkMzdlEAAAAAABnNhBZ3ZE1FME1PY1RQU2dZR2lWVjJDM3ZRAAAAAAAUCtIWZC0tUHFYdllTbEd5LUg4bnQyRlJVZwAAAAAAGc2FFndkTUUwTU9jVFBTZ1lHaVZWMkMzdlEAAAAAABnNhhZ3ZE1FME1PY1RQU2dZR2lWVjJDM3ZR"
}

以下是返回结果:

注意,此时游标移动了,所以我们可以通过游标的方式不断后移,直到移动到我们想要的 from+size 范围内。

看看python中实现:

python

def get_docs_by_scroll_v2(index, from_, size, scroll="10m"):
    """

    :param index:
    :param from_:
    :param size:
    :param scroll: scroll timeout, in timeout, the scroll is valid
    :param timeout:
    :return:
    """
    
    query_scroll = {
        "size": size,
        "sort": {"seq": {"order": "desc"}},
        "_source": ["seq"]
    }
    init_res = es.search(index=index, body=query_scroll, scroll=scroll, timeout=scroll)
    scroll_id = init_res["_scroll_id"]
    ans = []
    for i in range(1, int(from_/size)+1, 1):
        res = es.scroll(scroll_id=scroll_id, scroll=scroll)
        if i == int(from_/size):
            for item in res["hits"]["hits"]:
                ans.append(item["_source"])

    return ans

我们只需要通过size控制每次游标的移动范围,具体结果看实际需求。

游标确实可以帮我们获取到超1w的数据,但也有问题,就是如果分页相对深的时候,游标遍历的时间相对较长,下面介绍另外一种方案。

方案2:设置 max_result_size

在此方案中,我们建议仅限于测试用,生产禁用,毕竟当数据量大的时候,过大的数据量可能导致es的内存溢出,直接崩掉,一年绩效白干。

下面看看操作吧。

kibana

# 调大查询窗口大小,比如100w
PUT demo_scroll/_settings
{
  "index.max_result_window": "1000000"
}

标签:index,10000,解决方案,游标,id,elasticsearch,demo,scroll,size
From: https://www.cnblogs.com/davis12/p/17298046.html

相关文章

  • ORA-28002 密码过期解决方案
    错误场景:当使用sqlplus进行登录时报错:ORA-28002密码过期。错误原因:由于oracle11g在默认在default概要文件中设置了密码过期天数,“PASSWORD_LIFE_TIME=180”,密码过期后就会报此提示。解决方案:1、查看用户的概要文件名,一般为defaultsql>SELECTusername,PROFILEFROMdba_users;......
  • Serilog.Sinks.Elasticsearch 写username到 ES失败
    Usingthelib:Serilog.Sinks.ElasticsearchandECS-dotnet whichprovidetheecsformat,wecanwritelogintoesinECSformat.Ihavebeenabletooveralllinktrace, now,Iwanttorecordtheusernameifuserhaslogged.Astonoshingly,sometime,itwor......
  • ansible-playbook之安装elasticsearch单机版
    一.准备环境:1.centos7环境2.安装ansible环境3.elasticsearch安装文件下载路径:  https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.6.2-linux-x86_64.tar.gz4.elasticsearch安装主机,作者用192.168.126.129作为elasticsearch安装环境二.规划:1.变量规......
  • 智能化仓储,自动分拣解决方案
    方案简介智能分拣货架、自动化分拣系统主要是面向仓储电商等企业提供快速的自动分拣、配送和流程追溯的解决方案,系统由检测控制装置、分类指示装置、条码识别、自动计件等装置组成。控制装置的作用是识别、接收和处理分拣信号,根据分拣信号的要求指示分类装置、按商品品种、对商品......
  • 报警监测管理解决方案
    方案简介本系统主要是由智能终端节点,感知传感器,执行控制单元,云服务器,手机APP远程管理,WEB远程管理平台等构成的物联网解决方案,适用于环境监测、畜牧养殖、水产养殖、温室大棚、电力监测等应用领域,可实现无人值守,实时监测,异常报警,现场自动控制,视频监控,远程调控管理及数据分析等功能......
  • python+playwright 学习-50 pytest-playwright 多账号操作解决方案
    前言pytest-playwright插件可以让我们快速编写pytest格式的测试用例,它提供了一个内置的page对象,可以直接打开页面操作。但是有时候我们需要2个账号是操作业务流程,比如A账号创建了一个任务,需要用到B账号去操作审批动作等。如果需要2个账号同时登录,可以使用context上下文,它可......
  • 解决方案丨用数字化解决餐饮连锁80%以上的管理难点
    随着新冠防控政策的优化调整,今年以来餐饮业迅速复苏,不少企业出现“用工荒”。餐饮行业是劳动密集型行业,只有通过科技创新,才能摆脱劳动力短缺给全行业带来的困扰。目前,餐饮连锁企业在门店运营中主要存在巡店管理难、门店防损难、运营增收难等问题。在悠络客看来,80%以上的这些管理难......
  • SOLIDWORKS Simulation仿真分析解决方案
    SOLIDWORKS Simulation是一个与SOLIDWORKS完全集成的设计分析系统。SOLIDWORKSSimulation提供了单一屏幕解决方案来进行应力分析、频率分析、扭曲分析、热分析和优化分析。SolidWorksSimulation凭借着快速解算器的强有力支持,使得您能够使用个人计算机快速解决大型问题。SOLI......
  • SOLIDWORKS Simulation仿真分析解决方案
    SOLIDWORKS Simulation是一个与SOLIDWORKS完全集成的设计分析系统。SOLIDWORKSSimulation提供了单一屏幕解决方案来进行应力分析、频率分析、扭曲分析、热分析和优化分析。SolidWorksSimulation凭借着快速解算器的强有力支持,使得您能够使用个人计算机快速解决大型问题。SOL......
  • 如何应用人工智能技术提高企业效率?探索最新解决方案
    ​ 越来越多的企业开始关注如何应用人工智能技术来提高企业的效率和竞争力。本文将探讨人工智能技术在企业中的应用,以及最新的解决方案。一、人工智能技术在企业中的应用自动化流程人工智能技术可以用于自动化企业的流程,从而提高工作效率。例如,企业可以使用自动化的机器人流......