ES_深度分页概念与解决方案

这篇具有很好参考价值的文章主要介绍了ES_深度分页概念与解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ES_深度分页概念与解决方案

一.深度分页问题

假如现在要查询990~1000的数据,查询逻辑要这么写:

GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
  "from": 990, # 分页开始的位置,默认为0
  "size": 10, # 期望获取的文档总数
  "sort": [
    {"price": "asc"}
  ]
}

这里是查询990开始的数据,也就是 第990~第1000条 数据。

单节点es的分页查询逻辑

elasticsearch内部分页时,必须先查询 0~1000条,然后截取其中的990 ~ 1000的这10条:

ES_深度分页概念与解决方案

查询TOP1000,如果es是单点模式,这并无太大影响。

es集群的分页查询逻辑

但是elasticsearch将来一定是集群,例如我集群有5个节点,我要查询TOP1000的数据,并不是每个节点查询200条就可以了:因为节点A的TOP200,在另一个节点可能排到10000名以外了。

因此要想获取整个集群的TOP1000,必须先查询出每个节点的TOP1000,汇总结果后,重新排名,重新截取TOP1000。

ES_深度分页概念与解决方案

那如果我要查询9900~10000的数据呢?是不是要先查询TOP10000呢?那每个节点都要查询10000条?汇总到内存中?

当查询分页深度较大时,汇总数据过多,对内存和CPU会产生非常大的压力,因此elasticsearch会禁止from+ size 超过10000的请求。

二.深度分页解决方案

1、限制请求

Es进行限制的10000+的数据.而淘宝则对深度分页处理则很直接,限制分页页数.超过100页后面的数据,基本认为是无效数据.则会丢弃这些数据.

2、scroll:

原理 : 将排序后的文档id形成快照,保存在内存。官方已经不推荐使用。

使用scroll滚动搜索,一次性查出一部分数据,降低服务器的压力. 第一次查询需要设置超时时间, 在第一次查询后生成 _scroll_id 下次查询会携带这个值. 把它作为起始只查询对应size个数据.

3、search after:

原理 分页时需要排序,原理是从上一次的排序值开始,查询下一页数据。官方推荐使用的方式。

第一次查询

ES_深度分页概念与解决方案

下一次查询

ES_深度分页概念与解决方案

注意

要保证排序值是唯一不重复的,否则分页时可能会漏掉数据。

期望结果:

  • 第一次查询:最后一条数据的排序值是 score=47,price=245。 score=47,price=245的数据只有一条
  • 下一次查询:查询 score=47,price=245之后的数据,没有任何问题

但是如果:

  • score=45,price=245的数据有多条,假定为doc1、doc2
  • 第一次查询第一页时,顺序是doc1、doc2,这一页刚好查询到了doc1
  • 查询下一页时,顺序是doc2、doc1,从第2条开始,查询到了doc1
  • 最终就漏掉了doc2

解决方案:文章来源地址https://www.toymoban.com/news/detail-409524.html

  • 建议保证排序条件值不重复,就不会出现上面的问题了
  • 例如:以score降序、price升序、_id降序。 _id是文档的唯一标识,是不重复的

到了这里,关于ES_深度分页概念与解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 外部无法访问ES的解决方案

    外部无法访问ES的解决方案: 打开Elasticsearch安装路径下config目录下的elasticsearch.yml文件,加入如下配置: discovery.seed_hosts: [\\\"host1\\\"] network.host: 0.0.0.0   重新启动ES即可。 PS:如果修改配置文件后,启动报错 max file descriptors [4096] for elasticsearch process is too low, increase to at least [6553

    2024年02月12日
    浏览(54)
  • ES模糊查询失效的坑,附解决方案

    最近在做需求开发的时候,有个需求,需要根据去ES中进行模糊搜索。于是首先想到了wildcard查询,根据,利用*通配符,类似于mysql中的like一样进行模糊搜索。 但是遇到了问题就是,根据单个汉字能正常模糊搜索,多个汉字就无法查询出数据。 单个汉字正常查询

    2024年02月11日
    浏览(58)
  • es解决只能默认查询10000条数据方案

    在使用es进行数据查询时,由于es官方默认限制了索引一次性最多只能查询10000条数据,这其实是es的一种保护机制,那么很多时候我们需要突破这种限制,例如需要进入数据同步的场景,则需要查询全部的数据,如何处理呢? 方案1:在设置索引属性时解除索引最大查询数的限

    2024年02月11日
    浏览(45)
  • ES查询时只能查询10000条数据解决方案

    方法1: 在restful请求时,解除索引最大查询数的限制 _all表示所有索引,如果针对单个索引的话修改成索引名称即可!!! 此时变可以查询300万条数据了,数据量太大可能存在超时问题,查询数据时加上超时参数。  方法2: 在创建索引的时候加上 方法3:         在查询时

    2024年02月11日
    浏览(47)
  • 生成式AI入门必读:基本概念、数据挑战与解决方案

    随着生成式 AI(通常简称为 GenAI)的兴起,我们的世界发生了翻天覆地的变化。而随着 AI 生成内容的革命性应用程序的出现,人们也认为生成式 AI 将从根本上影响社会的各个行业和部门。 组织们都在竞相捕捉生成式 AI 的潜力。如果您也是其中一员,那么您的首要任务就是了

    2024年04月26日
    浏览(36)
  • MySQL数据同步到ES的4种解决方案

    大家应该都在各种电商网站检索过商品,检索商品一般都是通过什么实现呢?搜索引擎Elasticsearch。那么问题来了,商品上架,数据一般写入到MySQL的数据库中,那么用于检索的数据又是怎么同步到Elasticsearch的呢? MySQL同步ES 这是能想到的最直接的方式,在写入MySQL,直接也同

    2024年02月08日
    浏览(55)
  • 深度解读AIGC存储解决方案

    5月26日,2023数据基础设施技术峰会在苏州举办,腾讯云首席存储技术专家温涛受邀出席并分享了腾讯云领先的存储技术在AIGC场景中的应用,通过对AIGC业务流程和场景的提炼,从内容生成、内容审核和内容智理三要素介绍了如何智能的存储和管理数据。下面我们一起回顾下温

    2024年02月16日
    浏览(36)
  • 【模拟IC】闩锁效应的概念,产生原因,工作过程及解决方案

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 闩锁效应指的是在CMOS工艺制作的芯片中,寄生三极管与寄生体电阻形成的电路,在一定条件下,会导致电源与地之间产生大电流,可能会永久损坏芯片。可以由图一看出,在同时具有NMOS和PMOS管时,P区

    2024年04月12日
    浏览(37)
  • 深度解析人脸识别绕过问题及解决方案

    关于人脸识别的安全问题,之前写过一篇文章: AI换脸背后的产业链详解,往后神仙姐姐背后有可能是… 人脸识别会产生的危害我们就不赘述了,大家其实从各种新闻都能看到相关的消息,什么10分钟被骗430万等新闻可是上了知乎热搜的! 今天我们主要讲一下黑灰产是怎么做

    2024年02月15日
    浏览(36)
  • 深度剖析 ThreadLocal 内存泄露问题及解决方案

    在多线程编程中, ThreadLocal 是一个常用的工具,用于在每个线程中维护独立的变量,避免了线程间的数据共享问题。然而,使用不当时, ThreadLocal 可能引发内存泄露,这是一个开发者们常常需要面对的难题。本文将深度剖析 ThreadLocal 内存泄露的原因,探讨解决方案,以及如

    2024年01月17日
    浏览(56)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包