如何做搜索?如何做搜索优化?如何在搜索领域快速成长?

news2024/11/27 2:11:27
  三年多的搜索研发经历,万亿级集群管理经历,集群优化搜索优化经历。将生产环境的集群,检索性能提升了数十倍。也遇到过大大小小的生产事故。在工作中有幸能够得到前谷歌中国首席架构陈老师的指导。在搜索方面,自己也积累了蛮多的经验。
  在篇文章中,先粗略的分享一下,在搜索方面,在使用elasticsearch做搜索方面,应该有哪些知识储备。如何做搜索?如何做好的搜索?如何提升性能。
  想要做好搜索,底层知识一定要扎实。在我看来,首先是es都有哪些功能,都提供了哪些API,是第一层。只有对es了解的面面俱到以后,才能写好功能需求,来什么需求都能处理,这时候可以做个出色的开发工程师。但是想要做搜索工程师,还是远远不够的,这时候至少要根据我本篇文章所提到的包含的知识方向、优化方向等内容,包含源码方面,都有深入的了解。才能去做优化优化,才能做好搜索。剩下的是长时间的积累,最好的成长来源于生产实践。当然,在大规模数据检索场景下,才会暴露更多问题,面临更多挑战。剩下的就是深度钻研,不断的解决生生产中的挑战。诸如万亿级数据检索秒级响应的需求,超大规模中的集群管理,稳定性保障。生产环境中遇到的堆空间不足等挑战。
  想好做好搜索,需要日积月累(大概需要1w个小时把)。需要大量的知识储备,需要大量的学习,调研,包括测试验证。最终才能做好。
  最后,大家如何有更好的搜索优化建议,可以传授给我,将不胜感激。大家有任何搜索相关方面的问题,都可以私聊我,进行讨论。我会毫无保留的和你交流我的经验。目标只有一个,把搜索做好,把我的搜索做好,把大家的搜索做好。

一、知识方向

1.1 倾向于技术细节,底层原理

  每个API最好都能深度了解其底层原理。多去看看源码。古人云知彼知己方能百战不殆。在你深入了解以后,才能知道它为什么快,又为什么慢,它的瓶颈在哪里,它适用哪些场景。其中优秀的设计思想,和巧妙的代码逻辑,可以让我们学习,提升自己的代码能力。其不足的点,也可以作为未来可提升可改造的点。

  这里有一些这两年整理的学习资料。感兴趣,可以学习学习

elasticsearch两年学习资料整理分享-CSDN博客

1.2 ES中的底层数据结构

   万物皆有根,在程序设计中,数据结构就是底层的基石。数据结构完全决定了性能。先去了解底层的数据结构,才能更好的去做优化。业务逻辑上100行优化,抵不上底层数据结构的1行优化。这里举个简单的例子。es中有keyword类型,和long类型。只有在了解了底层数据结构以后,就会知道,long类型在底层是用BKD树维护的。keyword类型会走倒排表。根据数据结构的特点特性我们很清楚,假如是做排序,或者范围查询,自然而然是BKD树更好一些。假如是做精准点查询(也就是term精准查询),那肯定是keyword更合适一些,走倒排表,走内存加速。特别是在大量查询的情况下,效果会更加明显。由于文章篇幅的原因,这里就不做过多的介绍了。仅作为抛转引玉把!

  这里可以看看我写过的几篇文章。

Es底层查询原理、数据结构、及性能分析_es数据结构-CSDN博客

Elasticsearch 存储原理-lucene底层数据结构_es底层存储结构-CSDN博客

深入解析什么是LSM-Tree_lsm tree-CSDN博客

关于es中聚类 与 Doc Values 与 列式存储问题_es列式存储-CSDN博客

1.3 ES中的读写源码原理

(可扩展,任意源码模块,例如集群管理模块、滚动查询模块)(不仅仅是Elasticsearch源码, 更有Lucene源码)

   我反复推荐去从源码中获取答案。去研究研究源码,可以提升我们的应变能力。在源码中,我们可以找到很多问题的最佳解。这里还是举个例子,在工作中做过最多的优化,肯定是查询和写入优化。可是如何去真正的做优化呢?从网上看看别人的经验贴?纸上得来终觉浅,绝知此事要躬行。不如自己去源码中了解原理。问题便能迎刃而解。例如,从Lucene源码和es源码中去看查询原理。我们能够知道在查询流程中,检索是检索在实际上发生在数据节点,分为两个阶段,第一个阶段是query,第二个阶段是将数据取回。数据节点获取数据后汇集给协调节点。(这些内容可能网上大部分经验贴中都有。但是我看过网上所有的关于这方面的帖子,没有人说,查询在lucene中最后是落在段上的。在源码中,查询多个段,是串行的。也就是段越多,查询排队的时间越长。此外在es中,一个请求,在一个节点上的查询分片的并发度是5,假如查询涉及的分片,在一个节点上的分布大于5,则需要一次排队。这将大大增加查询延迟。如果是做搜索优化的,可能看到这里,自己心中便已有了优化的方法。如何能不让它排队呢?如何对es掌握较深的话,其实就一个参数。

GET index-000010/_search?max_concurrent_shard_requests=10

这样就可以调整不用排队了。这时候又要去想想,这么调整,会有什么风险呢?实际调整完,发现并没有什么提升是怎么回事?(这里实际上又涉及到了es search 线程池的问题,底层CPU资源的问题。假如CPU不多,查询又多,线程池都被占用了,这里再怎么调整,都是无效的)此外,上边有提到,在段上的查询是串行的。想要提升检索性能,是不是可以通过减少段数?那如何减少段呢?es还是有提供API,就是forceMerge。这个又是怎么用的呢,有什么风险?这里就不再展开了。希望小伙伴们接着去探索。内容太多了,我无法全讲出来。

  这里再抛砖引玉一下,除了我上述提到的参数,还有哪些可以优化呢?

  此外这里是我写过的文章。

es 读流程源码解析-CSDN博客

ES indexSort 原理源码解析_es排序原理-CSDN博客

elasticsearch DSL部分 源码解析_elasticsearch dsl解析模块-CSDN博客

1.3 ES各版本新特性,与性能提升

  es不仅是一个非常出色的搜索引擎。而且它还是一个社区,非常活跃的社区成员特出各种各样的优化思路。lucene和es都在这样的优化建议的给养下,飞速的发展,快速的更新。拥抱开源的力量,切勿闭门造车,感受开源的力量,应用开源的力量。

   es的版本更新非常快。多则一个月,少则一周,就是一个小版本。多去看看都更新了些什么。总是有好处的。因为你在这个版本头痛的问题,无解的问题,说不一定在下一个版本,就得到官方的解决了。一个搜索场景的优化,你在逻辑上优化了半天,效果捉襟见肘。往往官方的一次改动,很就是很大幅度的提升。

  这里是我近两年来整理的 7.X版本和8.X版本的新特性。

elasticsearch 7.X全部版本的新特性与重大变化_elasticsearch7新特性-CSDN博客

ES 8.x新特性一览(完整版)_elasticsearch 新特性-CSDN博客

1.4 Lucene底层数据维护方式

  说白了。es是一个出色的天然分布式的壳子。lucene才是底层处理检索逻辑的核心。es中经常说的分片,其实就是一个lucene实例。

  索引在es源码中,其实只能这个壳子是如何包装这个流程的。光是这个壳子,已经非常出色了。说起搜索引擎,可能很多人都能说出来es。但是很少人能说出来lucene。

  作为一个数据库引擎,底层的实现细节,都在lucene中。数据究竟是如何维护的?如何存储的?什么设计思想,什么逻辑?我个人反反复复看了很多次lucene,从看不懂,到恍然大悟,原来是这样。再到拍案叫绝,原来还可以这么干。我们要善于站在巨人的肩膀上,继续前行。前提是爬上伟人的肩膀。

   说了这么多,还是去看看lucene源码吧。一开始可以先看看别人写的解析文章。慢慢的自己去理解源码。

1.5 如何编译源码,在源码上做改造

  自己动手编译一下源码。是第一步。

1.6 Es源码结构

 内容太多,暂不整理。这里提一下,GPT这么强,应该把它作为工具,来辅助理解和学习源码。

elasticsearch源码结构一览_elasticsearch 源码-CSDN博客

借助chatGPT强大的源码理解能力,来快速学习elasticsearch 7.11.1整体源码结构(用chatGPT学源码太香了)-CSDN博客

想优化ES检索,先了解底层Lucene,Lucene源码结构一览_lucene 源码解析-CSDN博客

二、优化方向

2.1 ES集群参数优化(上百个实战参数)

  这里可以看我这篇文章。这是我的生产实践经验。

几千亿级集群管理,近百个实用优化参数,涵盖集群、索引、客户端-CSDN博客

2.2 ES 访问ES,代码优化、参数优化(从底层讲参数优化)

   这里可以看我这篇文章。

几千亿级集群管理,近百个实用优化参数,涵盖集群、索引、客户端-CSDN博客

2.3 分词器优化方案,满足更多搜索场景,提升召回率

  这块内容很多,未来单独出一篇文章,来介绍分词器优化。这里简单提一下,通过优化分词器,可以解决30%以上的搜索召回问题!

2.4 数据写入优化

  这里看我这一篇文章。

关于elasticsearch的极限写入优化问题-CSDN博客

2.5 检索性能优化(有专利)

  这个这里先不写了。专利还在受理。还未进入公布阶段。等公布了再分享。敬请期待。

  这里是我写的搜索优化的专栏,该专栏中包含了几十篇,生产优化的经验。

https://blog.csdn.net/star1210644725/category_12341074.html?spm=1001.2014.3001.5482

  下边的专栏,包含了100多篇elasticsearch搜索相关的原创文章。

https://blog.csdn.net/star1210644725/category_9654555.html

2.6 聚合分析性能优化

  这里看我这一篇文章。

ES通过抽样agg聚合性能提升3-5倍-CSDN博客

2.7 BM25相关性算法与优化

 参看我这篇文章

白话ES搜索相关性问题_es tie_breaker-CSDN博客

2.8 排序优化——提升召回效果

  敬请期待,后面会整理文章。

2.9 脚本排序性能优化

  敬请期待,后面会整理文章。

2.10 底层数据存储优化(索引设计优化)

  敬请期待,后面会整理文章。

2.11 集群分片平衡优化(有专利)

  es是一个分布式搜索引擎。在分布式中,由于数据分布不均匀问题,会产生短板效应,或者说长尾效应。在实际的生产中,我们之前会经常出现,几百个节点中,仅有部分节点负载高。

  可在国家专利网站上根据名称搜索: 数据分片调整方法、装置、设备及可读存储介质

https://pss-system.cponline.cnipa.gov.cn/retrieveList?prevPageTit=changgui


下边的内容,后续会陆续不断的整理。

三、方案方向

要不要选择使用ES——ES中的利与弊

最佳集群规划方案

最佳机器配置方案

最佳性能测试方案

最佳数据治理方案

最佳数据架构方案

最佳参数优化方案

最佳集群写入方案

最佳集群查询方案

最佳数据迁移方案

最佳集群监控方案

最佳自动化运维方案

集群降本增效方案

抉择本地化还是上云

使用ES打造私有AI搜索

语义检索方案

跨模态检索方案

四、经验分享

万亿级数据治理优化分享

万亿级数据集群遇到的生产问题

五、搜索产品化

如何打造搜索中台,减少搜索在集团内部的重复开发工作,建设低代码开发平台。

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

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

相关文章

大模型专业术语语料如何采集!XPath高级技巧助力狩猎

最近采集大模型的某领域的专业术语语料&#xff0c;却发现一些网站的专业术语和名称解释深藏在一个 <div> 节点下的多个同级 <p> 节点中。这样的结构让爬虫在使用 .//text() 后获取文本时变得十分头疼&#xff0c;难以准确区分是术语还是解释。&#x1f613;。 不…

Backtrader 文档学习-Platform Concepts

Backtrader 文档学习-Platform Concepts 1.开始之前 导入backtrader &#xff0c;以及backtrader 的指示器、数据反馈的模块 。 import backtrader as bt import backtrader.indicators as btind import backtrader.feeds as btfeeds看看btind模块下有什么方法和属性&#x…

redis之五种基本数据类型

redis存储任何类型的数据都是以key-value形式保存&#xff0c;并且所有的key都是字符串&#xff0c;所以讨论基础数据结构都是基于value的数据类型 常见的5种数据类型是&#xff1a;String、List、Set、Zset、Hash 一) 字符串(String) String是redis最基本的类型&#xff0c;v…

Let‘s EasyV|年度作品征集:让数字孪生 看见设计的力量

转眼2023 已然迎来岁末&#xff0c;在这一年以来&#xff0c;关于「数字孪生」、关于「可视化」在遇到各类挑战的同时也在持续进化。在 2023 年&#xff0c;有越来越多人了解并投身于数字孪生可视化相关行业中来&#xff0c;持续制作打磨出更多更精彩的设计作品&#xff0c;并真…

ELF文件结构

ELF文件结构 前文结尾说到编译器编译源代码后生成的文件叫做目标文件&#xff0c;而目标文件经过编译器链接之后得到的就是可执行文件。那么目标文件到底是什么&#xff1f;它和可执行文件又有什么区别&#xff1f;链接到底又做了什么呢&#xff1f;接下来&#xff0c;我们将探…

产品调研——AI平台

本文主要记录了对腾讯云-TIONE平台、华为云-ModelArt等主流AI平台的产品调研。 交互式建模 简单点说就是提供了带训练资源的云IDE&#xff0c;使用形态包括Notebook、VsCode等。 腾讯云-TI平台 TI平台将tensorflow、pytorch、spark环境等均集成到一个Notebook容器中&#xf…

探索“超级服务器” TON:SDK 应用与开发入门

TON 是一个由多个组件构成的去中心化和开放的互联网平台&#xff0c;聚焦于实现广泛的跨链互操作性&#xff0c;同时在高可扩展性的安全框架中运作。TON 区块链被设计为分布式超级计算机或“超级服务器&#xff08;superserver&#xff09;”&#xff0c;旨在提供各种产品和服务…

分布式事务--TC服务的高可用和异地容灾

1.模拟异地容灾的TC集群 计划启动两台seata的tc服务节点&#xff1a; 节点名称ip地址端口号集群名称seata127.0.0.18091SHseata2127.0.0.18092HZ 之前我们已经启动了一台seata服务&#xff0c;端口是8091&#xff0c;集群名为SH。 现在&#xff0c;将seata目录复制一份&…

屏幕超时休眠-Android13

屏幕超时休眠-Android13 1、设置界面1.2 属性值1.2.1 默认值1.2.2 最小值限制 1.3 属性值疑问 Settings.System.SCREEN_OFF_TIMEOUT 2、超时灭屏2.1 锁定屏幕的超时2.2 屏幕灭屏的超时 3、永不休眠* 关键日志 1、设置界面 packages/apps/Settings/src/com/android/settings/dis…

(已解决)如何使用matplotlib绘制小提琴图

网上很多人使用seaborn绘制小提琴图&#xff0c;本人暂时不想学新的东西&#xff0c;就是懒。本文介绍如何使用matplotlib绘制小提琴图&#xff0c;很多其他博客只是使用最简单的语法&#xff0c;默认小提琴颜色会是蓝色&#xff0c;根本改不了。本文使用了一点高级的用法&…

深度学习环境配置超详细教程【Anaconda+Pycharm+PyTorch(GPU版)+CUDA+cuDNN】

在宇宙的浩瀚中&#xff0c;我们是微不足道的&#xff0c;但我们的思维却可以触及无尽的边界。 目录 关于Anaconda&#xff1a; 关于Pycharm&#xff1a; 关于Pytorch&#xff1a; 关于CUDA&#xff1a; 关于Cudnn&#xff1a; 一、&#x1f30e;前言&#xff1a; 二、&…

如何用 Cargo 管理 Rust 工程系列 戊

以下内容为本人的学习笔记&#xff0c;如需要转载&#xff0c;请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/-OiWtUCUc3FmKIGMBEYfHQ 单元和集成测试 Rust 为单元测试提供了非常好的原生支持。 创建库工程时&#xff0c;cargo 生成的源码文件 lib.rs 自带…

32、应急响应——linux

文章目录 一、linux进程排查二、linux文件排查三、linux用户排查四、linux持久化排查4.1 历史命令4.2 定时任务排查4.3 开机启动项排查 五、linux日志分析六、工具应用 一、linux进程排查 查看资源占用&#xff1a;top查看所有进程&#xff1a;ps -ef根据进程PID查看进程详细信…

不做数据采集,不碰行业应用,专注数字孪生PaaS平台,飞渡科技三轮融资成功秘诀

12月15日&#xff0c;飞渡科技在北京举行2023年度投资人媒体见面会&#xff0c;全面分享其产品技术理念与融资之路。北京大兴经开区党委书记、管委会主任常学智、大兴经开区副总经理梁萌、北京和聚百川投资管理有限公司&#xff08;以下简称“和聚百川”&#xff09;投资总监严…

头部游戏厂商鸿蒙合作,开发岗又‘缺人‘

12月18日&#xff0c;米哈游宣布将基于HarmonyOS NEXT启动鸿蒙原生应用开发&#xff0c;成为又一家启动鸿蒙原生应用开发的头部游戏厂商。 作为一家创立于2011年的科技型文创企业&#xff0c;上海米哈游网络科技股份有限公司推出了众多高品质人气产品&#xff0c;其中包括《崩坏…

Meta与Ray-Ban合作推出了一款全新智能眼镜外观时尚,而且搭载了能够“看到“你所看到的一切的人工智能技术

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

adb详细教程(五)-复制文件、截屏、录屏

adb对于安卓移动端来说&#xff0c;是个非常重要的调试工具。在进行安卓端的开发或测试过程中&#xff0c;有时需要了截屏或录屏&#xff0c;在设备上操作完成后再将文件导入电脑非常繁琐。​如果使用adb指令在进行截屏或录屏则会便捷许多。此篇文章介绍了如何使用adb指令进行文…

LLMs 玩狼人杀:清华大学验证大模型参与复杂交流博弈游戏的能力

作者&#xff1a;彬彬 编辑&#xff1a;李宝珠&#xff0c;三羊 清华大学研究团队提出了一种用于交流游戏的框架&#xff0c;展示了大语言模型从经验中学习的能力&#xff0c;还发现大语言模型具有非预编程的策略行为&#xff0c;如信任、对抗、伪装和领导力。 近年来&#x…

React系列:配置@别名路径并配置联想

&#x1f341; 作者&#xff1a;知识浅谈&#xff0c;CSDN签约讲师&#xff0c;CSDN博客专家&#xff0c;华为云云享专家&#xff0c;阿里云专家博主 &#x1f4cc; 擅长领域&#xff1a;全栈工程师、爬虫、ACM算法 &#x1f492; 公众号&#xff1a;知识浅谈 &#x1f525;网站…

【NI-RIO入门】扫描模式

于NI KB摘录 所有CompactRIO设备都可以访问CompactRIO扫描引擎和LabVIEW FPGA。 CompactRIO 904x 系列是第一个引入 DAQmx 功能的产品线。 扫描引擎&#xff08;IO 变量&#xff09; – 主要为迁移和初始开发而设计。控制循环频率高达 1 kHz1&#xff0c;性能控制器上的频率更…