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

news2024/11/25 10:59:42

项目中用到了 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.coloradmin.cn/o/1354943.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软文推广宣发遵循的基本流程

在软文发稿的旅程中&#xff0c;制定明确的策略思路是确保成功的关键。软文发稿有一定的流程需要我们遵循&#xff0c;才能达到理想的软文宣发效果。首先&#xff0c;我们要明确发稿的地区&#xff0c;然后精准选择目标受众&#xff0c;最后才能展开内容的创作。下面&#xff0…

springboot整合springbatch批处理

springboot整合springbatch实现批处理 简介项目搭建步骤 简介 项目搭建 参考博客【场景实战】Spring Boot Spring Batch 实现批处理任务&#xff0c;保姆级教程 步骤 1.建表 建表sql CREATE TABLE student (id int NOT NULL AUTO_INCREMENT,name varchar(100) NOT NULL C…

02-SpringCloud-Eureka注册中心

Eureka注册中心 假如我们的服务提供者user-service部署了多个实例&#xff0c;如图&#xff1a; 大家思考几个问题&#xff1a; order-service在发起远程调用的时候&#xff0c;该如何得知user-service实例的ip地址和端口&#xff1f;有多个user-service实例地址&#xff0c;…

力扣hot100 翻转二叉树 递归

&#x1f468;‍&#x1f3eb; 题目地址 &#x1f60b; AC code /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNod…

CNN——AlexNet

1.AlexNet概述 论文原文&#xff1a;ImageNet Classification with Deep Convolutional Neural Networks 在LeNet提出后&#xff0c;卷积神经网络在计算机视觉和机器学习领域中很有名气。但卷积神经网络并没有主导这些领域。这是因为虽然LeNet在小数据集上取得了很好的效果&am…

jQuery常用的 四大基本选择器

文章目录 简介&#xff1a;基础选择器1. 通过 ID 选择器获取元素2. 通过 class 选择器获取元素3. 通过标签名选择器获取元素 层级选择器1. 通过直接子元素选取2. 通过后代元素选取 属性选择器1.[attributevalue]属性选择器2.[attribute!value] 属性选择器3.[attribute*value]属…

如何在Windows安装Wnmp服务并实现固定地址远程访问

文章目录 前言1.Wnmp下载安装2.Wnmp设置3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 WNMP是Windows系统下的绿色NginxMysqlPHP环境集成套件包&#xff0c;安装完成后即可得到一个Nginx MyS…

字符串处理-第11届蓝桥杯省赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第26讲。 字符串处理&#…

Typescript---webpack和Babel的使用 03

webpack 通常情况下&#xff0c;实际开发中我们都需要使用构建工具对代码进行打包&#xff0c;TS同样也可以结合构建工具一起使用&#xff0c;下边以webpack为例介绍一下如何结合构建工具使用TS。 步骤&#xff1a; 初始化项目 进入项目根目录&#xff0c;执行命令 npm init -…

Dockerfile + harbor详解

Dockerfileharbor私服 一 docker工作流 1. docker管理流程 2. 镜像仓库阿里 (1) 阿里私有仓库 公司内部管理项目涉及到的所有docker镜像&#xff0c;会使用私有仓库的方式&#xff0c;集中管理。 (2) 创建阿里Docker仓库 登录阿里云创建私有仓库 网址&#xff1a;容器镜像服…

希亦、觉飞、小吉三款婴儿洗衣机大比拼!全方位对比测评

由于年龄幼小的婴儿的皮肤都非常的幼嫩&#xff0c;因此婴儿衣物材质的类型大部分都是采用为纯棉&#xff0c;并且婴儿的衣物不能够与大人的衣物一起进行混洗&#xff0c;容易把细菌感染到宝宝的衣物上&#xff0c;因此很多家庭为了保证宝宝衣服的有效清洁&#xff0c;避免交叉…

感恩客户·持续向上-契约锁电子签章

2023年&#xff0c;电子签章成为组织数字化建设中的刚性需求&#xff0c;市场机遇帮助契约锁实现了产品、伙伴、客户、应用场景等全方位的持续发展。 感恩客户和伙伴的支持&#xff0c;让契约锁在2023年不断成长和进步。 感恩客户相伴成长 2023年&#xff0c;契约锁为“政府机关…

IDEA 控制台中文乱码问题解决方法(UTF-8 编码)

设置 IDEA 编码格式 1&#xff1a;打开 IntelliJ IDEA>File>Setting>Editor>File Encodings&#xff0c;将 Global Encoding、Project Encoding、Default encodeing for properties files 这三项都设置成 UTF-8 2&#xff1a;将 vm option 参数改为&#xff1a; -…

os.path.join(a,b)末尾出现\问题

文章目录 问题描述解决 问题描述 config[save_path] dataset/data/output 并且 config[model_name] &#xff08;空字符串&#xff09; os.path.join() 函数在处理路径时会正确处理路径分隔符&#xff0c;并避免出现多余的斜杠。但是&#xff0c;如果 config[‘save_path’]…

Linux进程以及计划任务

一.程序和进程以及线程 内核功用&#xff1a;进程管理、内存管理、文件系统、网络功能、驱动程序、安全功能等 对于所有的操作系统&#xff0c;都有基本的功能 1.程序 保存在硬盘、光盘等介质中的可执行代码和数据&#xff08;硬盘上躺着&#xff09; 静态保存的代码 执行…

MongoDB—SQL到MongoDB映射图表

一、术语和概念 下表显示了各种 SQL 术语和概念 以及相应的 MongoDB 术语和概念。 SQL Terms/Concepts MongoDB Terms/Concepts database database table collection row document or BSON document column field index index table joins $lookup, embedded docu…

ssm基于echarts的基金交易网站的设计与实现论文

摘 要 计算机网络发展到现在已经好几十年了&#xff0c;在理论上面已经有了很丰富的基础&#xff0c;并且在现实生活中也到处都在使用&#xff0c;可以说&#xff0c;经过几十年的发展&#xff0c;互联网技术已经把地域信息的隔阂给消除了&#xff0c;让整个世界都可以即时通话…

C语言中指针变量如何使用

一、指针变量的定义与声明 1.1 定义 指针变量是用来存储另一个变量的内存地址的变量。在C语言中&#xff0c;指针变量的类型是指向某个类型的指针。例如&#xff0c;int *p; 表示一个整型指针变量p。 1.2 声明 指针变量的声明分为两种形式&#xff0c;一种是直接声明&#…

什么是数据同步?为什么它很重要?

您的员工经常在不同的应用程序中查看同一组数据。 营销人员可能会在营销自动化平台中查看潜在客户&#xff0c;销售可能会在 CRM 中查看它们&#xff1b; HR 团队可能会在人力资源信息系统中跟踪员工信息&#xff0c;而 IT 可能会在项目管理系统中跟踪信息&#xff1b;财务团队…

EDI 项目推进流程

EDI 需求确认 交易伙伴发来EDI对接邀请&#xff0c;企业应该如何应对&#xff1f; 首先需要确认EDI需求&#xff0c;通常包括传输协议和报文标准以及传输的业务单据类型。可以向交易伙伴发送以下内容&#xff1a; &#xff08;中文版&#xff09; 与贵司建立EDI连接需要使用…