2023年12月5日,北京elastic Meetup 腾讯分享的搜索优化经验

news2024/12/24 16:31:03

1、减少长文本模糊匹配,降低 CPU 大量分词上的开销

  长文本全文查询由于在查询时需要进行分词处理,因此在查询并发较大的情况下, cpu会先于IO被打满,从而出现大量的查询拒绝。

2、设置多副本提高并发和均衡单节点压力

  Search查询请求是从索引的主副本分片中随机选择一个分片进行查询,因此 多个副本可以充分利用多节点性能,避免 单节点压力过大导致整体性能下降。

3、使用 SSD 硬盘,读多写少场景比高性能云盘性能提升

  当索引的段很多的时候,实际上请求过程,是很多小文件的IO。在聚合分析请求中,也是非常吃IO资源的。特别是大规模是的聚合分析。通常是IO先于CPU跑满,导致load高。
  SSD至少有30以上的提升。这里跟我我自己的生产经验。云上的服务器的IO性能普遍虚高。没有本地机房的效果好。  

4、频繁更新的索引要定期执行 Forcemerge,降低查询时Segment文件的遍历

   频繁更新的索引会产生大量的soft_deleted文档,既占用磁盘空间,还会消 耗查询性能,建议在低峰期定期执行ForceMerge。
执行forcemerage常用API:
POST /my-index/_forcemerge
POST /myindex/_forcemerge?max_number_segme
nts=1
POST /myindex/_forcemerge?only_expunge_delete
s=true

5、利用缓存:不需要算分的查询使用 filter context 代替 query

  query 关注的是此文档与查询子句的匹配相关度如何? filter 关注的是此文档与查询子句是否匹配,是否满足查询条件?(不涉 及算分) 具体说明可参考官方文档。使用filter可以跳过打分过程,从而降低延迟。

6、搜索排序场景在写入时对索引设置Index Sorting数据提前排序,减少随机 IO,提升查询性能

  默认情况下,Lucene 不会做任何排序操作,Search 请求必须检索与查询相匹配的 所有文档,然后返回按指定字段排序的 TopN 文档。 而通过 index.sort.* 设置可以对Segment内的特定字段进行排序,字段类型支持 boolean、numeric、date 和 keyword(doc_values)。详情可参考官方文档。
通过降低写入速度间接提升检索速度,适用于读多写少场景。
PUT index_name
{
"settings": {
"index": {
"sort.field": "timestamp",
"sort.order": "desc" 
}
},
"mappings": {
"properties": {
"timestamp": {
"type": "date"
}
}
}
}

GET /index_name/_search
{
"size": 10,
"sort": [
{ "timestamp": "desc" }
]
}
ES会检查每个提前排好序的segment文件
的topN条doc返回,而不再对shard上所有
的segment文件进行遍历,大大降低查询耗
时。

7、为文件系统缓存预留足够的内存空间

  ES的检索性能高度依赖底层的 Filesystem Cache,如果给 Filesystem Cache 预留足够的内存,那么搜索时候将基本都是走内存,检索性能会非常高 建议 机器的总内存容量至少可以容纳索引数据量的一半 ,并预热Filesystem Cache,   这样基本可以做到亿级文档毫秒级响应。详情可参考官方文档。

8、 自定义 routing 写入和检索,减少分片查询范围

  自定义 routing 查询,可以做到精准分片检索,减少索引分片的 查询范围,提升查询性能。 容易踩坑的点: 如果routing存在严重数据不均等情况,可能会出现严重的热点分 片和查询超时问题。
这种情况下先通过reindex临时解决问题,长期解决需去除自定义 routing并拆分索引。

9、docvalue_fields 替代 source,降低查询过程中解压及网络传输开销

  • 从 source中 取数据,由于走的是行存,因此每次查询都会读取一行数据, 从一行数据中过滤字段,其中在解压、序列化等操作上有较多的性能开销
  • 通过使用 docvalues_fileds 替代source,由于是直接从列存中取数据,可 以大大降低检索过程中的source 字段的解压缩及序列化开销。行存检索变列存检索
  • 通过将 stored_fileds 设置为 _none_,可以降低返回结果的流量消耗,提 升查询性能
经验总结:
  docvalue_fields + stored_fileds 结合使用,可大幅度提升查 询性能。
GET filebeat-7.2.1/_search
{
"from": 0,
"size": 5000, 
"_source": {
"includes": [
"region","host.name”
]
}
}
GET filebeat-7.2.1/_search
{
"from": 0,
"size": 5000, 
"stored_fields": ["_none_"],
"docvalue_fields": [
"region","host.name”
]
}

 这里看到测试结果。提升有数10倍。

此优化不适用的场景:
需要取回的字段中包含如下情况:
1、text类型相关的字段
2、嵌套类型的对象
3、显示设置doc_value为false的字段("doc_values": false)

10、docvalue_fields 替代 source,降低查询过程中解压及网络传输开销

性能测试:
  基于8C 32G 规格,构建100w 条测试数据(每条数据包含100个字段)不断变化查询字段数进行查询,得到如下结果:
性能测试结果分析:
1、当字段数很少时,低于40,使用 doc_value Fields 拉取,耗时最低,性能最优。
分析: 如果我们只需要返回其中包含的一小部分字段时,读取并解压这个巨大的
_source字段可能会开销很高。
2、 当字段超较多时,达到40以上时,使用 _source 耗时最低,查询性能最优。
分析: 当需要非常多、几乎全部字段时,此时使用 doc_value Fields 可能会有非常多
的随机IO。此时读取 _source 一个字段就能够包含几乎全部字段,耗时最低。
3、在不同数据场景下,_source、列存、Store 查询性能的平衡点可能会偏移,还是
需要实际的压测

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

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

相关文章

Linux访问MySQL数据库(包含实验案例)

1、访问MySQL数据库。 1.1、登录到MySQL服务器 经过安装后的初始化过程,MySQL数据库的默认管理员用户名为"root",密码为空。 [rootyang ~]# mysql -u root //"-u"选项用于指定认证用户有密码的情况下,使用"-p&qu…

【OpenCV】 OpenCV 源码编译并实现 CUDA 加速 (Windows)

OpenCV 源码编译并实现 CUDA 加速 Windows 1. 环境准备1.1 软件环境1. 2 源码下载 2. CMake编译项目2.1 创建cmake项目2.2 设置编译配置2.3 解决异常2.3.1 文件下载异常2.3.2 解决CUDA版本异常 2.4 编译项目 3. Visual Studio 编译项目4. 项目测试5. 总结 OpenCV是一个基于Apac…

鸿蒙南向开发环境的搭建

在嵌入式开发中,很多开发者习惯于使用Windows进行代码的编辑,比如使用Windows的Visual StudioCode进行OpenHarmony代码的开发。但当前阶段,大部分的开发板源码还不支持在Windows环境下进行编译,如Hi3861、Hi3516系列开发板。因此&…

Hudi cleaning

核心概念 hudi提供了很多项数据服务来管理表中的数据,其中有一项服务称之为Cleaner(数据清理服务)。随着用户向表中写入的数据越多,对于每一次的更新,hudi都会产生一个版本的数据文件保存更新后的记录(COP…

Javascript 嵌套函数 - 递归函数 - 内置函数详解

Javascript 嵌套函数 - 递归函数 - 内置函数详解 目录 Javascript 嵌套函数 - 递归函数 - 内置函数详解 一、嵌套函数 二、递归函数 三、内置函数 在了解了函数的定义和函数调用外,下面我们来介绍一下JavaScript中几种特殊的函数。 JavaScript特殊函数有3种&a…

工艺雕塑品牌网站搭建效果如何

工艺雕刻品往往受到不少人喜欢与较高的市场需求度,比如室内雕塑摆件、室外标志性雕刻品等,而对相关企业来说,品牌经营过程中也面临着一些难题: ① 品牌传播难 工艺雕刻品因为只有小部分人才会需要或采购,可能大部分民…

JAVA序列化(创建可复用的 Java 对象)

JAVA 序列化(创建可复用的 Java 对象) 保存(持久化)对象及其状态到内存或者磁盘 Java 平台允许我们在内存中创建可复用的 Java 对象,但一般情况下,只有当 JVM 处于运行时,这些对象才可能存在,即,这些对象的生命周期不…

暂退法(丢弃法)

在深度学习中,丢弃法(Dropout)是一种常用的正则化技术,旨在减少模型的过拟合现象,可能会比之前的权重衰减(Weight Decay)效果更好。通过在训练过程中随机丢弃一部分神经元,可以有效地减少神经网络中的参数依…

普冉(PUYA)单片机开发笔记(11): I2C通信-配置主从收发

概述 在上一篇《普冉(PUYA)单片机开发笔记(10): I2C通信-配置从机-CSDN博客》配置了 PY32F003 的 I2C 从机一侧,今天配置主机,并实现主-从机之间的报文收发。 为了完成这个实验,需要两块 PY32F003F18P 的开发板&…

001 Windows虚拟机

一、虚拟机安装Windows10 选自定义安装 升级是针对你电脑上有系统的情况下,你要升级;没有系统就选择自定义。 硬盘60G 直接单击下一步就是一个盘 如果你想对磁盘进行分区 分第一个区的时候它会去创建系统的保留分区和系统分区,然后还剩20…

Linux下C++程序瘦身

目录 一.前言二.如何瘦身三.如何读取调试信息文件四.其他 一.前言 我们知道,C程序如果带着调试信息的话会比较大,所以一般发布版本都会去掉调试信息,但是我们又希望如果程序崩溃了可以使用core转储文件进行调试,如果不带调试信息…

数据结构之----贪心算法

数据结构之----贪心算法 什么是贪心算法? 贪心算法是一种常见的解决优化问题的算法,其基本思想是在问题的每个决策阶段,都选择当前看起来最优的选择,即贪心地做出局部最优的决策,以期望获得全局最优解。 贪心算法简…

SpringBoot配置文件加载的优先级及自定义配置

Spring Boot使用一个非常特殊的PropertySource顺序,旨在允许合理的值重写,越靠前优先级越高。属性按以下顺序考虑: 开发者工具Devtools全局配置参数 在IDEA或Eclipse中,安装并启用Spring Boot Devtools插件。打开项目的Settings…

[Big Bird]论文解读:Big Bird: Transformers for Longer Sequences

文章目录 1 介绍2 模型架构3 结果 论文:Big Bird: Transformers for Longer Sequences 作者:Manzil Zaheer, Guru Guruganesh, Avinava Dubey, Joshua Ainslie, Chris Alberti, Santiago Ontanon, Philip Pham, Anirudh Ravula, Qifan Wang, Li Yang, Am…

【Java 并发】三大特性

在 Java 的高并发中,对于线程并发问题的分析通常可以通过 2 个主核心进行分析 JMM 抽象内存模型和 Happens-Before 规则三大特性: 原子性, 有序性和可见性 JMM 抽象内存模型和 Happens-Before 规则, 前面我们讨论过了。这里讨论一下三大特性。 1 原子性 定义: 一个…

HarmonyOS4.0从零开始的开发教程17给您的应用添加通知

HarmonyOS(十五)给您的应用添加通知 通知介绍 通知旨在让用户以合适的方式及时获得有用的新消息,帮助用户高效地处理任务。应用可以通过通知接口发送通知消息,用户可以通过通知栏查看通知内容,也可以点击通知来打开应…

基于CNN+数据增强+残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)+数据集+模型(一)

系列文章目录 基于CNN数据增强残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)数据集模型(一) 基于CNN数据增强残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)数据集模型&#xf…

Win11极速安装Tensorflow-gpu+CUDA+cudnn

文章目录 0.pip/conda换默认源1.Anacondapython虚拟环境2.安装CUDA以及cudnn测试tensorflow的GPU版本安装成功的办法 0.pip/conda换默认源 为了高效下载,建议先把默认源换了,很简单这里不再赘述。(我用梯子,所以没换源&#x1f6…

数据分析(一)(附带实例和源码)

一、主要目的: 主要利用Python包,如Numpy、Pandas和Scipy等常用分析工具并结合常用的统计量来进行数据的描述,把数据的特征和内在结构展现出来。熟悉在Python开发环境中支持数据分析的可用模块以及其中的方法,基于一定的样例数据…

【Java】使用递归的方法获取层级关系数据demo

使用递归来完善各种业务数据的层级关系的获取 引言:在Java开发中,我们通常会遇到层层递进的关系型数据的获取问题,有时是树状解构,或金字塔结构,怎么描述都行,错综复杂的关系在程序中还是可以理清的。 这…