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

  三年多的搜索研发经历,万亿级集群管理经历,集群优化搜索优化经历。将生产环境的集群,检索性能提升了数十倍。也遇到过大大小小的生产事故。在工作中有幸能够得到前谷歌中国首席架构陈老师的指导。在搜索方面,自己也积累了蛮多的经验。
  在篇文章中,先粗略的分享一下,在搜索方面,在使用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.mfbz.cn/a/253935.html

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

相关文章

最具挑战的骑行路线

1,318川藏线 2,独库公路 - 561公里 3,珠峰尼泊尔 1000公里 4,沙漠公路 1800公里 5,219新藏线 2500公里 下面是一些别人的骑行记录、证书或奖牌。 参考: 1,抖音 - Max骑行玩家 https://v.douy…

链路聚合 (hcia)

原理 采用链路聚合技术可以在不进行硬件升级的条件下,通过将多个物理接口捆绑为一个逻辑接 口,达到增加链路带宽的目的。在实现增大带宽目的的同时,链路聚合采用备份链路的机制, 可以有效的提高设备之间链路的可靠性 &#x…

Chrome2023新版收藏栏UI改回旧版

版本 120.0.6099.109(正式版本)Chrome浏览器菜单新版、旧版的差异 想要将书签、功能内容改回旧版的朋友可以网址栏输入:「chrome://flags」,接着搜寻「Chrome Refresh 2023」。 最后将 Chrome Refresh 2023、Chrome Refresh 2023…

如何使用JavaScript 将数据网格绑定到 GraphQL 服务

前言 作为一名前端开发人员,GraphQL对于我们来说是令人难以置信的好用。它可以用来简化数据访问,这让我们的工作变得更加容易。 什么是 GraphQL?它是一个抽象层,位于任意数量的数据源之上,并为您提供一个简单的 API …

学网安:先来学学Python之Excel

在 Python 中,exec 是一个内置函数,允许在运行时动态执行 Python 代码。虽然 exec 的使用需要谨慎,因为它可以导致安全问题和难以调试的代码,但它也提供了一些非常强大的功能。 本文将详细介绍 Python exec 函数的高级用法&#…

GZ015 机器人系统集成应用技术样题5-学生赛

2023年全国职业院校技能大赛 高职组“机器人系统集成应用技术”赛项 竞赛任务书(学生赛) 样题5 选手须知: 本任务书共 24页,如出现任务书缺页、字迹不清等问题,请及时向裁判示意,并进行任务书的更换。参赛队…

基于linux系统的Tomcat+Mysql+Jdk环境搭建(一)vmare centos7 设置静态ip和连接MobaXterm

特别注意,Windows10以上版本操作系统需要下载安装VMware Workstation Pro16及以上版本,安装方式此处略。 (可忽略 my*** 记录设置的vamare centos7 账号root/aaa 密码:Aa123456 ) 1、命令行和图形界面切换 如果使用的是VMware虚拟机&…

Activiti工作流框架学习笔记(一)之通用数据表详细介绍

文/朱季谦 Activiti工作流引擎自带了一套数据库表,这里面有一个需要注意的地方: 低于5.6.4的MySQL版本不支持时间戳或毫秒级的日期。更糟糕的是,某些版本在尝试创建此类列时将引发异常,而其他版本则不会。执行自动创建/升级时&a…

C/C++ STL提供的关联式容器之unordered_set

unordered_set 容器,直译为[无序set容器]。 unordered_set容器和set容器很像,唯一的区别就在于 set 容器会自行对存储的数据进行排序,而unordered_set容器不会。 unordered_set的几个特性: 1. 不再以键值对的形式存储数据&#x…

数据科学知识库

​ 我的博客是一个技术分享平台,涵盖了机器学习、数据可视化、大数据分析、数学统计学、推荐算法、Linux命令及环境搭建,以及Kafka、Flask、FastAPI、Docker等组件的使用教程。 在这个信息时代,数据已经成为了一种新的资源,而机…

基于.NetCore开发评论系统(转)

博客前台以及后端涉及的代码主要在以下文件: StarBlog.Web/Services/CommentService.csStarBlog.Web/Apis/Comments/CommentController.csStarBlog.Web/Views/Blog/Widgets/Comment.cshtmlStarBlog.Web/wwwroot/js/comment.js 管理后台的代码在以下文件&#xff1…

Linux学习教程(第十三章 Linux数据备份与恢复)

第十三章 Linux数据备份与恢复 不知道大家有没有丢失过重要的数据呢? 丢失数据的理由是多种多样的,有人是因为重装系统时,没有把加密文件的密钥导出,重装系统后密钥丢失,导致所有的加密数据不能解密;也有人…

C语言—小小圣诞树

这个代码会询问用户输入圣诞树的高度&#xff0c;然后根据输入的高度在控制台上显示相应高度的圣诞树。 #include <stdio.h>int main() {int height, spaces, stars;printf("请输入圣诞树的高度: ");scanf("%d", &height);spaces height - 1;st…

使用Halcon实现模板匹配

图片: 代码: read_image (Image, C:/Users/14348/Desktop/mobanpipei.jpg) get_image_size (Image, Width, Height) dev_close_window() dev_open_window (0, 0, Width, Height, black, WindowHandle) dev_display (Image) draw_rectangle1 (WindowHandle, Row1, Column1, Ro…

字符设备驱动框架的编写

一. 简介 我们在学习裸机或者 STM32 的时候关于驱动的开发就是初始化相应的外设寄存器&#xff0c;在 Linux 驱动开发中&#xff0c;肯定也是要初始化相应的外设寄存器。 只是在 Linux 驱动开发中&#xff0c; 我们需要按照其规定的框架来编写驱动&#xff0c;所以说学 …

Docker介绍,Docker安装

docker镜像仓库官网 一、Docker的基本概念 1.Docker的三大核心组件 docker 镜像 --------docker images docker 仓库---------docker registeries docker 容器---------docker containers 2.Docker 镜像 Docker镜像是运行docker容器时的只读模板&#xff0c;每一个镜像由一…

设计模式——迭代器模式

引言 迭代器模式是一种行为设计模式&#xff0c; 让你能在不暴露集合底层表现形式 &#xff08;列表、 栈和树等&#xff09; 的情况下遍历集合中所有的元素。 问题 集合是编程中最常使用的数据类型之一。 尽管如此&#xff0c; 集合只是一组对象的容器而已。 大部分集合使用…

springboot221酒店管理系统

springboot221酒店管理系统 源码获取&#xff1a; https://docs.qq.com/doc/DUXdsVlhIdVlsemdX

CentOS7安装教程

1.准备工作 安装虚拟机软件 VMware Workstation 17 Player下载CentOS7 镜像 2. 安装VMware Workstation 17 Player 官网 下载链接 下载好了安装包&#xff0c;双击安装包&#xff0c;傻瓜式安装一直下一步&#xff0c;安装即可。 3. 安装CentOS7 官网 推荐下载地址&…

Vue 按键修饰符

常用按键修饰符&#xff1a;enter【回车】、delete【删除】、esc【退出】、space【空格】、tab【缩进】、up【上】、down【下】、left【左】、right【右】 。 系统按键修饰符&#xff1a;ctrl、alt、shift、meta【四个小方块】 。 鼠标修饰符&#xff1a;left【左键】、right…
最新文章