ElasticSearch 10000条查询数量限制

这篇具有很好参考价值的文章主要介绍了ElasticSearch 10000条查询数量限制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

我们将库存快照数据导入ES后发现要分页查询10000条以后的记录会报错,这是因为ES通过index.max_result_window这个参数控制能够获取数据总数from+size最大值,默认限制是10000条,因为ES考虑到数据要从其它节点上报到协调节点如果搜索请求的数据越多,会导致ES协调节点占用的堆内存和搜索排序时间越大,但是我们又有这样的需求,虽然页面展示不需要翻到10000条记录后,但在导出XLS是需要将20万条数据一次性导出,本文介绍如何实现。

二、问题重现

1、创建映射

elasticsearch查询数据条数,存储,elasticsearch,大数据,搜索引擎

2、构造5万条数据导入ES

搭建SpringBoot工程使用ES官方Client构造测试数据(注:ES的Client实在是太乱了,N套SDK然后不同版本差别又很大,真是折腾)。

配置依赖包

elasticsearch查询数据条数,存储,elasticsearch,大数据,搜索引擎

创建客户端连接

elasticsearch查询数据条数,存储,elasticsearch,大数据,搜索引擎

注:因为ES的连接其实走HTTP的,但是采用的是持久连接还是多路复用HTTP2是由SDK底层实现(待研究),自己应该是不用管理连接池。

批量写入数据

elasticsearch查询数据条数,存储,elasticsearch,大数据,搜索引擎

注:使用fluent DSL批量导入5万条数据,20秒就完成导入,一般批量写入每次1000~5000条记录,数据量大小在5M~15M之间效率会比较高。

3、查询

get /store_stock/_search

elasticsearch查询数据条数,存储,elasticsearch,大数据,搜索引擎

注:返回文档数量为10000,而不是50000

分页查询10000后的10条记录

elasticsearch查询数据条数,存储,elasticsearch,大数据,搜索引擎

报错信息如下,告诉你只能查10000条数据.

elasticsearch查询数据条数,存储,elasticsearch,大数据,搜索引擎

用ESClient查询

elasticsearch查询数据条数,存储,elasticsearch,大数据,搜索引擎

同样会报错如下

三、解决方案

1、调大index.max_result_window

elasticsearch查询数据条数,存储,elasticsearch,大数据,搜索引擎

然后再次查询

elasticsearch查询数据条数,存储,elasticsearch,大数据,搜索引擎

返回结果如下:发现已经可以查出10001~10010这些数据,但返回的总数total值还是10000.使用ESClient也同样能够查出数据。但这种方式特别占用内存.

elasticsearch查询数据条数,存储,elasticsearch,大数据,搜索引擎

2、ES深度分页

深度分页原理如下图所示,图片来源于网络。

elasticsearch查询数据条数,存储,elasticsearch,大数据,搜索引擎

注:因为写入分片的数据是无序的,但你分页查询结果是要排序的,这个时候在每个每片要查出的数量都是你需要查出的数据总数,然后所有分片整合在一起进行排序,再取出你所需要的数量。

这里产生二次排序,如果查询的数据越靠后,越容易造成OOM,这也是ES为了避免产生频繁FGC,默认设置max_result_window的值为10000的原因。

另外像Google、Baidu等分页查询在产品功能上都做成不能跳到某一页来做限制。它们分页的组件如下,从产品层面避免了深度分页。

elasticsearch查询数据条数,存储,elasticsearch,大数据,搜索引擎

3、滚动查询

但我们在导出或者做数据分析时总是需要查询10000条以后的数据,那怎么办,这里可以使用滚动查询 Scroll(类似于数据库的游标)。

使用方法

1、首次查询加上scroll参数,5m表示返回的scrollId 在5分钟内有效

elasticsearch查询数据条数,存储,elasticsearch,大数据,搜索引擎

返回的数据:查询出了10000条数据,total的数量显示50000,并且返回了一个_scroll_id

elasticsearch查询数据条数,存储,elasticsearch,大数据,搜索引擎

然后用scroll_id往后查

elasticsearch查询数据条数,存储,elasticsearch,大数据,搜索引擎

返回结果:可以继续往后查

elasticsearch查询数据条数,存储,elasticsearch,大数据,搜索引擎

ESClient代码如下

elasticsearch查询数据条数,存储,elasticsearch,大数据,搜索引擎

4、Scroll查询原理

ES搜索分两个阶段:Query阶段和Fetch阶段

Query阶段:比较轻量级,通过查询倒排索引获取满足查询结果的文档ID列表。

Fetch阶段:需要将每个shard的结果取回,在协调结点进行全局排序。

Scroll查询,先做轻量级的Query阶段以后,免去了繁重的全局排序过程。它只是将查询结果集,也就是doc id列表保留在一个上下文里, 之后每次分批取回的时候,只需根据设置的size,在每个shard内部按照一定顺序(默认doc_id续), 取回这个size数量的文档即可。(注:没搞懂,需要再深入分析一下)。文章来源地址https://www.toymoban.com/news/detail-740381.html

到了这里,关于ElasticSearch 10000条查询数量限制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ElasticSearch返回值数量超过10000条解决方案

    环境 : Centos7 + ES 7.9.0 集群 Elasticsearch官方默认限制索引查询最多只能查询10000条数据,查询第10001条数据开始就会报错: 但是很多时候10000数据不能满足项目的需求,所以我们就要解除这个限制。 elasticsearch中 max_result_window 有上限限制:默认10000。 在 restful 请求时,解除索引最

    2023年04月16日
    浏览(31)
  • 如何解决elasticsearch分页总数量超过10000条就报错

    默认情况下,Elasticsearch集群中每个分片的搜索结果数量限制为10000。这是为了避免潜在的性能问题。具体报错信息如下: 但是,可以通过以下几种方法解决这个问题。 1. 使用scroll API:scroll API可以帮助我们在不加载所有数据的情况下获取所有结果。它会在后台执行查询以获取

    2024年02月17日
    浏览(39)
  • elasticsearch结果窗口限制10000[from+size小于或等于10000]

    Elasicsearch版本7.8,执行DSL查询 结果Elasicsearch报如下错误 其实Elasicsearch这个错误已经提示的很明显了,甚至提出了解决方案。大概意思是说:结果窗口太大,from+size必须小于或等于10000,但我们检索的DSL中from+size=10001。我们在查询大量数据时可以采用 scroll api 这种高效的方式。

    2024年02月16日
    浏览(28)
  • Elasticsearch索引数量限制

    Elasticsearch的索引可以无限创建吗? Elasticsearch 7.9.1 Elasticsearch启动 Elasticsearch启动采用默认配置 代码 使用SpringBoot编写测试代码,对ES进行索引创建测试。 SpringBoot连接配置 测试类代码 单机测试,设置每个索引占用4个分片,0个副本,先创建1000个索引进行测试,是否能创建成功

    2023年04月08日
    浏览(35)
  • Elasticsearch 查询超过10000 的解决方案 - Python

    法1:修改 设置 max_result_size (不推荐) 法2: scroll 分页 法3: search_after 分页 还有一个方法是在参考文章2里面提到的 track_total_hits ,但是我测试的时候没起作用,目前还不太清楚原因。。。 我看参考文章里说到search_after 分页要比scroll快,但是在我的数据上是scroll要快很多,

    2024年01月23日
    浏览(40)
  • 解决 Elasticsearch 分页查询记录超过10000时异常

    查询结果中 hits.total.value 值最大为10000的限制 解决方法: 1、 请求设置rest_total_hits_as_int=true 注意参数需要放在请求头上 2、修改setting的值  

    2024年02月07日
    浏览(27)
  • 设置es的返回数量超过10000条限制

    ElasticSearch官方默认限制索引查询最多只能查询10000条数据,查询第10001条数据开始就会报错: \\\"reason”:\\\"Result window is too large,from + size must be less than or equal to: [10000] but was [12000] elasticsearch中 max_result_window 有上限限制:默认10000。 第一种解决方案 1.在请求时解除限制 设置查询最

    2024年02月05日
    浏览(37)
  • Elasticsearch 查询和聚合查询:基本语法和统计数量

    摘要:Elasticsearch是一个强大的分布式搜索和分析引擎,提供了丰富的查询和聚合功能。本文将介绍Elasticsearch的基本查询语法,包括预发查询和聚合查询,以及如何使用聚合功能统计数量。 Elasticsearch是一种开源的分布式搜索和分析引擎,广泛应用于各种场景,包括日志分析、

    2024年02月11日
    浏览(36)
  • Elasticsearch分页搜索数量不能超过10000的解决This limit can be set by changing the [index.max_result_window] index

    开发环境:  JDK1.8、Elasticsearch7.3.1、RestHighLevelClient 问题:  最近在通过Java客户端操作ES进行分页查询(from+size)时,分页获取满足条件的数据和总数。发现满足条件的数据总数一旦超过10000条,使用SearchResponse的getHits().getTotalHits().value返回的结果永远是10000。为什么会被限制只能搜

    2024年02月04日
    浏览(28)
  • Graylog日志查询超过10000限制问题

    在使用graylog时,默认分页查询存在限制,真实使用不能满足,需要我们手动处理。当查询超过执行长度时,会出现一下错误提示 问题描述 查询超过 10000 页, Elasticsearch 出现异常 解决方案 方案一:修改配置文件,重启 Elasticsearch 服务【 Elasticsearch5.x 版本以后不支持】 修改

    2024年02月04日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包