从Solr到ES再到黑鸟,GitHub正式启动基于Rust新代码搜索引擎
yuyutoo 2025-01-02 20:10 1 浏览 0 评论
昨天GitHub官方发布消息,宣布其使用Rust语言重写的代码搜索引擎黑鸟系统Blackbird正式启用。关于黑鸟系统的历史和技术,今天虫虫就给大家普及一下。
概述
黑鸟系统的目标是实现开发人员快速搜索、导航和理解其代码,将关键信息置于上下文中,并最终提高他们的工作效率。 为实现这一目标,需要实现以下功能:
首先,一个完全重新设计的搜索界面,带有建议、补全以及对结果进行切片和切块的能力。
其次,需要完全从头开始构建了一个新的代码搜索引擎。新的引擎需要非常快(大约是旧代码搜索速度的两倍),功能更强大(支持子字符串查询、正则表达式和符号搜索),并且理解代码,将最相关的结果放在排名最前面。
最后,要完全重新设计GitHub的代码视图,将搜索、浏览和代码导航紧密集成。
Github代码搜索历史和问题
GitHub成立于2008年,最初使用Apache Solr来处理其代码搜索。
在Solr被并入Lucene之后。 2013年Github团队使用Elasticsearch对其搜索进行了改造,基于Elasticsearch创建了一个新的搜索服务。
随后,基于Elasticsearch搜索服务屡次出现服务终端故障。
在探索了基于通用文本搜索产品来支持代码搜索,GitHub发现基于现有产品搭建的系统用户体验差,索引速度慢,托管成本高。
2020年GitHub内部开始了一个新项目黑鸟系统,用来解决搜索服务不稳定的问题。
黑鸟架构
黑鸟系统架构图如下:
黑鸟系统是基于Rust语言,从零开始构建搜索引擎,专门用于代码搜索领域。
黑鸟系统所要实现的用户体验愿景:
能够提出代码问题并通过迭代搜索、浏览、导航和阅读代码获得答案。
GitHub团队通过实践意识到其代码搜索与一般文本搜索有根本的区别。
首先、代码已经被设计成可以被机器理解,所以其内部在结构上、功能上和功能上下文上必然存在联系性。
同时搜索代码也有独特的要求,需要搜索标点符号(例如,句号或左括号);不能从查询中删除停用词;另外,代码搜索还需要支持正则表达式。
最后,GitHub的巨大仓库规模是一个很大的挑战。其基于Elasticsearch的搜索系统,需要花费数月的时间来索引当时800万仓库的代码。
目前GitHub仓库数已经超过了2亿,而且还在持续增长中,这对搜索引擎来说是个巨大的挑战。
目前GitHub可搜索库有4500万公开库,代码总量为115TB,还有155亿的相关文档。
千万级代码的索引
黑鸟系统所要解决的第一个问题是如何在合理的时间内构建对这4500万代码库的代码和文档进行索引。由Git的天然特性,其内容可通过哈希寻址并且GitHub 上实际上有很多重复内容,所以可行的策略是:
按Git blob对象ID进行分片 ,git对象天然这提供了一种在分片之间均匀分布文档同时避免任何重复的好方法。由于特殊的存储库,不会有任何热服务器,可以根据需要轻松扩展分片的数量。
将索引建模为树并使用增量编码来减少爬行量并优化索引中的元数据。元数据就像文档出现的位置列表(路径、分支和存储库)和有关这些对象的信息(存储库名称、所有者、可见性等)。 对于流行内容,此数据可能非常大。
黑鸟还专门进行了设计将查询结果在提交级别的基础上保持一致。
当用户从存储库范围的查询中获取结果时,其他人可能正在对全局结果进行分页并查看不同于先前但仍然一致的索引状态。使用其他搜索引擎很难做到这一点。黑鸟提供这种级别的查询一致性作为其设计的核心部分。
查询的生命周期
在实现了对代码的索引后,系统跟踪查询就比较容易实现了。比如黑鸟系统查询是符Rail组织用于查找Ruby编程语言编写的代码的正则表达式,格式为:
/arguments?/ org:rails lang:Ruby
查询路径的高级架构图:
在网站和分片之间是黑鸟查询服务(BQS),它协调接受用户查询并将请求分散到搜索集群中的每个主机。黑鸟系统使用Redis来管理配额和缓存一些访问控制数据。
前端接受用户查询并将其传递给BQS,查询服务将查询解析为抽象语法树,然后重写它,将诸如语言之类的东西解析为其规范的Linguist 语言ID,并在额外的条款上标记权限和范围。这样,就可以看到重写如何确保将从公共存储库或有权访问的任何私有存储库中获得结果。
接着查询分成n个请求,并行请求到后端分片服务:
BQS得到分片的结果后,聚合所有分片的结果,按分数重新排序,过滤(双重检查权限),并返回前100列表。搜索前端仍然需要做语法高亮,term高亮、分页,然后将渲染到页面呈现给用户。
来自各个分片的p99响应时间大约为100ms,但由于聚合响应、检查权限和语法突出显示等原因,总响应时间会稍长一些。一个查询占用索引服务器上的单CPU内核100ms,GitHub 现有一台64核主机大约每秒可以执行640个查询。性能非常强硬,而且由于天然地分布式分片,所以可以很方便实现水平扩展,为同时用户查询和未来增长提供了充足的空间(多加分片服务器即可)。
总结
黑鸟代码搜索系统是一个全新的基于Rust的高性能分布式代码搜索系统。GitHub团队基于现有业务和问题的解决基础积极探索重新开发出适合自己独特业务、规模和需求的系统值得每一个软件系统架构师学习和借鉴。
当然对于广大的码农来说,以后在GitHub站搜代码更方便和快捷,GitHub也对其新系统提供了丰富的文档(docs.github /en/search-github)希望大家赶紧探索尝试,找出一些好用的技巧来给大家分享。
- 上一篇:VBA实现目录递归查找
- 下一篇:这五款牛逼的 IDEA 插件,堪称代码质量检查利器
相关推荐
- 如何在EXCEL中进行IP地址排序
-
Excel中排序IP地址是非常不友好的,它完全是通过首位进行排序,无法实现我们的实际效果。作为IT人员对于IP地址的真正诉求是想要从小到大排列。那么如何进行排序呢?在Excel中,我们可以使用如下函数...
- Excel揭秘!Left函数开启高效字符串左端截取模式
-
今日推荐:LEFT函数。目的:把一组身份证号码或者一组电话号码的敏感信息隐藏起来。...
- 五十一、UiPath字符串函数的介绍和使用(转)
-
一、字符串属性Length:是指字符串长度如:intlen=字符串变量.Length;Chars:是指字符串转换成字符数组,数组从0开始,通常配合Length属性使用如:System.Charc=...
- 打工人一定要会的Excel的15个技巧!
-
今天给各位打工人分享15个Excel常用的小技巧,废话不多说,直接开始!先给大家看一张快捷键速查表:1.Ctrl+C和Ctrl+V只是入门你可能已经很熟悉基本的复制粘贴,但如果你想让粘贴操作更高...
- go语言中字符串常用的系统函数
-
最近由于工作比较忙,视频有段时间没有更新了,在这里跟大家说声抱歉了,我尽快抽些时间整理下视频今天就发一篇关于go语言的基础知识吧!我这我工作中用到的一些常用函数,汇总出来分享给大家,希望对...
- 最全的 ES 重点内容整理(上)
-
●我们从很多年前就知道ES6,也就是官方发布的ES2015●从2015年开始,官方觉得大家命名太乱了,所以决定以年份命名●但是大家还是习惯了叫做ES6,不过这不重要●重要的是...
- 2024 最火的5个顶级白板应用,燃爆了!
-
大家好,很高兴又见面了,我是"...
- Excel Trim函数用法的6个实例,Excel 顽固空格的去除方法
-
在Excel中,Trim函数用于去文本的前后空格和字符之间的空格,但在去字符之间的空格时,它不会把所有空格都去除,而是留下一个空格;如果要把字符之间的所有空格都去掉,需要用Substitute函数...
- TS类型体操,看懂你就能玩转TS了
-
本文以Typescript4.5及以上版本为基础,于2022年02月07日在掘金首发本文要实现一种类型工具...
- 一种接地气的编码规则:废弃驼峰式命名,告别手敲基础代码。
-
一种好的编码规则,能提高工作效率。在软件编程领域内,“驼峰”式命名规则是首选方式,最早来源于Perl语言编程的畅销书《programPerl》(oRelly出版)的封面图片正是一匹骆驼,故而得名。...
- AI 应用开发最常用的解释型Python语言如何保护源代码
-
众所周知,解释型语言Python/JavaScript/Perl/Shell是在无需编译,可以直接运行,因此很难保护源代码,例如C、C++、JAVA属于编译型语言,运行之前需要先编译才能运行...
- 2020年树莓派的5种最佳编程语言
-
树莓派是最灵活的电脑之一。也许不是在硬件上,但是它的可操作性使它成为一个独立的类。树莓派跨越了电脑和编程之间的鸿沟,让每个人都能接触到电脑。因此,各个年龄段的编程爱好者都掀起了一股编程热潮。它允许他们...
- 5 种即将消亡的编程语言
-
每个编写代码的人都有自己喜欢的语言...
- [240610] 5 种 Non-Posix Shell 在 x-cmd 上的支持 | Perl 发布 5.40.0
-
5种非PosixSHell-nushell,fish,xonsh,csh,pwsh利用三天假期,我开始动手增加了对各种Non-Posixshell的x-cmd支持。在这个过程中,...
- Linux批量修改文件名及强大的$\「\」用法介绍
-
一:Rename命令rename命令用字符串替换的方式批量改变文件名。rename命令有两个版本,一个是c语言版本的,一个是perl语言版本的,判断方法:vim`whichrename`C语言版本...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)