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

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 查询性能的平衡点可能会偏移,还是
需要实际的压测

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习 | 线性算法 —— 大禹治水

Machine-Learning: 《机器学习必修课:经典算法与Python实战》配套代码 - Gitee.com 如果说KNN算法体现了人们对空间距离的理解, 那么线性算法则体现了人们对事物趋势上的认识。 注意图中横纵坐标的不同。 线性回归、多项式回归多用于预测,逻辑…

基于linux系统的Tomcat+Mysql+Jdk环境搭建(四)linux安装Mysql

1.切换到你需要安装mysql的路径 cd /root/usr/ 2.在线安装 安装网上的安装方式都有很多,可以自己百度一下 我们这里是自己搭建测试环境,可以直接选择在线安装,命令如下:yum install mysql-server, 但是我失败了 ┭┮…

蜂鸣器的工作原理

电路原理图使用SH69P43为控制芯片,使用4MHz晶振作为主振荡器。 PORTC.3/T0作为I/O口通过三极管Q2来驱动蜂鸣器LS1,而PORTC.2/PWM0则作为PWM输出口通过三极管Q1来驱动蜂鸣器LS2。另外在PORTA.3和PORTA.2分别接了两个按键,一个是PWM按键&#x…

使用 Wired XDisplay 连接失败的原因

使用 Wired XDisplay 连接扩展屏,有时候会连接不上 ,记下解决方法,以备后用: 1、扩展屏和主屏 一直在连接中,可能是其中一端没有提供数据访问权限 ps. 水果用户需要 打开 iTunes 并登陆 ,安卓用户 可能是 …

Mistral MOE架构全面解析

从代码角度理解Mistral架构 Mistral架构全面解析前言Mistral 架构分析分词网络主干MixtralDecoderLayerAttentionMOEMLP 下游任务因果推理文本分类 Mistral架构全面解析 前言 Mixtral-8x7B 大型语言模型 (LLM) 是一种预训练的生成式稀疏专家混合模型。在大多数基准测试中&…

1.Mybtis-Plus框架基本使用

Mybatis-plus是一个mybatis的增强工具,在mybatis的基础上只做增加不做改变,简化开发 提供通用的`mapper和service` 可以在不编写任何SQL语句的情况下快速实现对单表CRUD、批量、逻辑删除、分页操作 Mybatis-plus提供优秀插件,并对idea中快速开发插件mybatisX也进行功能使用。…

甜酷女孩穿搭 I 时尚与保暖都兼具的羽绒服

这款工装风羽绒服 酷酷的中性风 清新温柔的杏紫两色 采用定制复合面料 顺滑平整硬朗的材质 具有防水功能 下雪下雨天也不用担心哦 90白鹅绒,立领连帽设计 帽子做的是可拆卸 可以切换两种风格 袖口采用可调节魔术贴设计 下摆可调节抽绳设计 处处透着细节…

网络安全——SSH密码攻击实验

一、实验目的要求: 二、实验设备与环境: 三、实验原理: 四、实验步骤:​ 五、实验现象、结果记录及整理: 六、分析讨论与思考题解答: 网络安全-SSH密码攻击实验效果截图: https://downloa…

设计模式(3)--对象结构(3)--组合

1. 意图 将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。 2. 三种角色 抽象组件(Component)、组合式节点(Composite)、叶节点(Leaf) 3. 优点 3.1 定义了包含基本对象和组合对象的类层次结构。 客户代码中&…

openwrt中taiscale自动安装脚本详解

openwrt中taiscale自动安装脚本详解 一、代码仓库地址 https://github.com/adyanth/openwrt-tailscale-enabler 二、代码仓库中脚本文件详解 主要包含三个脚本分别是etc/init.d/tailscale、usr/bin/tailscale、usr/bin/tailscaled ,接下来逐个分析一下脚本中的具…

【Redis】AOF 基础

因为 Redis AOF 的实现有些绕, 就分成 2 篇进行分析, 本篇主要是介绍一下 AOF 的一些特性和依赖的其他函数的逻辑,为下一篇 (Redis AOF 源码) 源码分析做一些铺垫。 AOF 全称: Append Only File, 是 Redis 提供了一种数据保存模式, Redis 默认不开启。 AOF 采用日志的形式来记…

Go标准包之flag命令行参数解析

1.介绍 在 Go中,如果要接收命令行参数,需要使用 flag 包进行解析。不同的参数类型可以通过不同的方法接收。 2.参数接受 2.1 接受方式 使用flag接收参数,可以由以下三种方式接受: 方式一: flag.Type(name,defaultVal,desc)方…

Linux上使用HTTP协议进行数据获取的实战示例

嗨,Linux爱好者们,今天我们要一起探讨一下如何在Linux上进行HTTP协议的数据获取。这不是一项简单的任务,但放心,我会以最简单的语言,结合实例来给大家讲解。 首先,我们需要一个工具,那就是curl…

Python生成器(Generator)(继续更新...)

学习网页: Welcome to Python.orghttps://www.python.org/https://www.python.org/ Python生成器 生成器(Generator)是 Python 的一种特殊类型的迭代器。生成器允许你创建自己的数据流,每次从数据流中获取一个元素,…

医保电子凭证在项目中的集成应用

随着医保电子凭证使用普及,医疗行业的各个场景都要求支持医保码一码通办,在此分享一下,在C#和js中集成医保电子凭证的demo 供有需要的小伙伴参考。 一、项目效果图 在c#中集成医保电子凭证效果 在js中集成医保电子凭证效果 二、主要代码 c#…

Linux_Docker图形化工具Portainer如何安装并结合内网穿透实现远程访问

文章目录 前言1. 部署Portainer2. 本地访问Portainer3. Linux 安装cpolar4. 配置Portainer 公网访问地址5. 公网远程访问Portainer6. 固定Portainer公网地址 前言 本文主要介绍如何本地安装Portainer并结合内网穿透工具实现任意浏览器远程访问管理界面。Portainer 是一个轻量级…

算法竞赛备赛进阶之树形DP训练

目录 1.树的最长路径 2.树的中心 3.数字转换 4.二叉苹果树 5.战略游戏 6.皇宫守卫 树形DP是一种动态规划方法,主要用于解决树形结构的问题。在树形DP中,通常会使用动态规划的思想来求解最优化问题。其核心在于通过不断地分解问题和优化子问题来解决…

【理论篇】SaTokenException: 非Web上下文无法获取Request问题解决 -理论篇

在我们使用sa-token安全框架的时候,有时候会提示:SaTokenException:非Web上下文无法获取Request 错误截图: 在官方网站中,查看常见问题排查: 错误追踪: 跟着源码可以看到如下代码: 从源码中&a…

01 整体代码运行流程

文章目录 01 整体代码运行流程1.1 运行官方 Demo1.2 变量命名规则1.3 多线程1.4 线程锁1.5 SLAM 主类 System 01 整体代码运行流程 1.1 运行官方 Demo 以 stereo_kitti 为例,执行 ./stereo_kitti path_to_vocabulary path_to_settings path_to_sequence./stereo_…

大创项目推荐 深度学习 python opencv 实现人脸年龄性别识别

文章目录 0 前言1 项目课题介绍2 关键技术2.1 卷积神经网络2.2 卷积层2.3 池化层2.4 激活函数:2.5 全连接层 3 使用tensorflow中keras模块实现卷积神经网络4 Keras介绍4.1 Keras深度学习模型4.2 Keras中重要的预定义对象4.3 Keras的网络层构造 5 数据集处理训练5.1 …