elasticsearch的查询方式和数据库事务隔离级别的思考

项目中用到了 elasticsearch,发现有几种查询方式不太一样,思考了一下,总结如下

普通分页

等同于关系数据库的分页查询,例如 mysql 的 limit,如下 sql

select * from test limit 100000,10

这种查询方式有一个问题,需要查询 1000010 条数据到内存中,然后筛选出最后的 10 条数据进行返回,这样就会造成一个问题,对内存大大浪费。

对于 elasticsearch 也是这样,所以针对分页数量大于 10000 的数据做了限制,需要手动开启参数 track_total_hits 为 true 才行,如果这样做了会产生一个问题,就是大量数据加载 jvm 中(elasticsearch使用java开发,使用的lucene也是),内存吃紧开销大,造成频繁的 gc。

解除查询限制

PUT _all/_settings
{"index" : {"max_result_window" : 1000000}
}

这种方式是治标不治本,不建议修改

需要确保如下要求

from + size < max_result_window

为了解决这个深分页的问题,滚动查询出现了

scroll查询

https://www.elastic.co/guide/en/elasticsearch/reference/5.0/search-request-scroll.html

从 5.0 版本开始添加。

scroll API 可用于从单个搜索请求检索大量结果(甚至所有结果),这与在传统数据库上使用游标的方式大致相同。
scroll 并不是为了实时用户请求,而是为了处理大量数据,只能往下查询。

通过第一次查询后返回一个scroll id,往后每次查询都基于这个scroll id,直到查询不到数据为止。

开始查询时形成一个快照,连续查询过程中,不会将新增加或修改的数据添加到查询结果中,也不支持跳页查询。

初始化时将所有符合搜索条件的搜索结果缓存起来,可以想象成快照,在遍历时,从这个快照里取数据,也就是说,在初始化后对索引插入、删除、更新数据都不会影响遍历结果。

如果想要在查询过程中某些数据修改了,需要查询到最新的数据。需要使用 search_after 来实现。

类似于事务隔离级别中的 REPEATABLE READ,每个事务只会在第一次执行查询语句时生成一个 ReadView,即数据修改了不影响本次查询的结果。

search_after

https://www.elastic.co/guide/en/elasticsearch/reference/5.0/search-request-search-after.html

和 scroll 查询一样,从 5.0 版本开始添加。使用的场景不同。

search_after不是自由跳转到随机页面的解决方案,而是并行滚动许多查询的解决方案。

它与 API 非常相似,与 scroll 不同的是,search_after参数是无状态的,它总是根据搜索器的最新版本进行解析。因此,排序顺序可能会在步行过程中发生变化,具体取决于索引的更新和删除。

在查询过程中至少指定一个唯一不重复字段来排序。

类似于事务隔离级别中的 READ COMMITTED,每个事务在每次查询开始时都会生成一个独立的 ReadView,即数据修改了每次执行查询了数据都是不同的。

官方改进

轻量级试图(pit)

https://www.elastic.co/guide/en/elasticsearch/reference/7.10/point-in-time-api.html

https://www.elastic.co/guide/en/elasticsearch/reference/7.10/scroll-api.html

在这个文档上,指出了不推荐使用 scroll 查询,使用 search_after 和 pit 来代替。即针对快照数据建议使用这种方式。

对于search_after 和 pit 结合使用与 scroll 的到底有什么区别,官方文档也没做说明,也没找到对应的性能对比测试。

总结

查询方式数据量实时查询排序跳页使用场景与关系数据库事务隔离级别对应关系
from+size浅分页<=1000支持支持支持实时跳页查询,搜索引擎READ COMMITTED
scroll>10000不支持支持不支持深分页,无序批量查询.。
后台批处理、导出
REPEATABLE READ
search_after>10000支持支持不支持深分页,实时大批量查询READ COMMITTED

参考链接

https://blog.csdn.net/liaomingwu/article/details/117323936

https://blog.csdn.net/weixin_46097842/article/details/107889284

https://cloud.tencent.com/developer/article/1825190

https://juejin.cn/post/7088110134076899365

https://blog.csdn.net/UbuntuTouch/article/details/119926953

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/319824.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyQt 多线程多进程研究

杰哥&#xff0c;PyQT系统界面卡顿的问题是因为检测图片的耗时太长了&#xff0c;大概一张图片四十多秒。如果用多线程来解决耗时几秒的任务&#xff0c;是可以在之前卡顿问题上进一步解决的。但是不能解决像我们这种超长耗时的任务的&#xff0c;只能利用多线程来避免。我尝试…

计算机网络知识点

1. URI 和 URL 统一资源定位符&#xff08;Uniform Resource Locator&#xff0c;缩写&#xff1a;URL&#xff09;&#xff0c;是对资源的引用和访问该资源的方法。俗称网址&#xff0c;就是浏览器地址栏里面的内容。 URL 语法为&#xff1a;protocol://userInfohost:port/p…

大数据 - Doris系列《一》- Doris简介

目录 &#x1f436;1.1 Doris 概述 &#x1f436;1.2 OLAP和OLTP&#xff08;面试&#xff09; 1. 应用场景 &#x1f959;联机事务处理OLTP(On-Line Transaction Processing) &#x1f959;联机分析处理OLAP(On-Line Analytical Processing) 2. OLAP和OLTP比较--“用户行…

自建代码托管平台 GitLab 安装指南

目录 前言1 GitLab简介2 安装服务器准备2.1 选择适合的操作系统2.2 网络设置2.3 SSH 连接 3 安装包准备3.1 获取 GitLab CE 安装包3.2 查阅官方文档 4 配置运行脚本4.1 创建安装脚本4.2 赋予执行权限4.3 执行安装脚本4.4 验证 GitLab 安装 5 初始化 GitLab 服务6 启动 GitLab 服…

实验笔记之——下载数据到服务器

开发过程中经常需要把数据传到服务器上&#xff0c;太麻烦了&#xff0c;为此本博文记录采用百度云来传输数据 百度云 使用bypy包。 安装&#xff1a;pip install bypy 配置bypy连接百度网盘&#xff1a; 终端输入bypy info将命令行提示的链接复制到浏览器&#xff0c;并复制…

【Java】log4j和slf4j区别

log4j&#xff1a;Apache Software Foundation 开源 slf4j&#xff1a;不支持日志滚动等高级功能 在开源库或内部库中使用 SLF4J&#xff0c;将使其独立于任何特定的日志记录实现&#xff0c;这意味着无需为多个库管理多个日志记录配置&#xff0c;您的客户端将会很需要这一点…

[笔记] 使用 qemu 创建虚拟磁盘并安装 grub

之前使用 wsl 进行了直接创建虚拟磁盘并安装 grub,现在希望能够直接借助 qemu 的工具创建虚拟磁盘文件并安装 grub,由于需要用到 nbd(net block device网络块设备) 模块,在 wsl 中并不支持,因此这里使用到了 Hypver-V 虚拟机创建了一个 Ubuntu 系统,在系统中安装了 qemu 和 gru…

CEC2017(Python):蜣螂优化算法DBO求解CEC2017

一、CEC2017简介 参考文献&#xff1a; [1]Awad, N. H., Ali, M. Z., Liang, J. J., Qu, B. Y., & Suganthan, P. N. (2016). “Problem definitions and evaluation criteria for the CEC2017 special session and competition on single objective real-parameter numer…

【springboot配置文件加载源码分析】

在Spring Boot的源码中&#xff0c;配置文件的加载是在应用程序启动的早期阶段进行的。具体来说&#xff0c;配置文件加载的主要步骤发生在SpringApplication类的run()方法中的prepareEnvironment方法中&#xff0c;真正读取我们的配置文件还是PropertySourceLoader。 本篇博客…

C++-赋值-string字符串类-函数

赋值 1&#xff09;通常编程中使用进行赋值操作&#xff0c;C增加了一些新的赋值语法。 #include <iostream>using namespace std;int main() {int a 1;//普通模式int b(2);//int b2;int c(a);//int c a;int d(ab);//int dab;cout <<"a" << a &…

如何下载和安装 Eclipse?

1.进入官网。Eclipse的官网地址为https://www.eclipse.org/。 2.在官网首页&#xff0c;点击“Download”按钮进入下载界面。 3.查找自己需要的 Eclipse 对应的版本。Eclipse有着多个版本&#xff0c;每个版本都有自己特定的用途和功能&#xff0c;主要包括以下版本&#xff1…

JSON网络令牌JWT

1.什么是身份验证 日常生活中的身份验证的场景: 比如进入公司的大楼时&#xff0c;需要携带工牌&#xff1b;打卡上班时&#xff0c;需要指纹识别&#xff1b;打开工作电脑时&#xff0c;需要输入密码。 2. 什么是 JSON 网络令牌&#xff1f; JSON Web Token (JWT) 是一个开…