15年做不好的代码搜索,用Rust重写搞定:GitHub声称能从此“改变游戏规则”

Rust搜索服务器、rust快速找服教程 Rust盒子推出服务器搜索功能,依靠大数据检索,帮国内玩家检索Rust官服、模组、和社区类服务器,并对服务器信息进行汉化处理,大大降低了国人找服务器的门槛,节约了游戏时间... 阅读详情

GitHub 宣称,源代码搜索引擎将给业界带来颠覆性变革。  

GitHub 上可供搜索的代码浩如烟海,全球代码仓库已经超过 2 亿,并且这些代码不是静态的:它在不断变化,这就给代码搜索引擎带来了相当大的挑战。

上线 15 年来,GitHub 一直努力给大家提供一个好用的代码搜索引擎,但一直不能如愿。这两年,GitHub 用 Rust 从头开始构建了自己的搜索引擎,专门用于代码搜索领域,并且自发布后已经极大地改善了该平台的代码搜索能力。

1、GitHub 从头构建代码搜索引擎的动机

搜索是工程师最常用的功能之一,谷歌内部曾对工程师做一次调研,发现平均每位工程师每天会进行 5.3 次代码搜索会话 (session),执行 12 个代码搜索请求。

对于 GitHub 这个用户已经达到一亿的代码托管平台来说,具备一个性能良好的搜索引擎尤其重要。然而 GitHub 自身的代码搜索引擎一度被用户吐槽“形同虚设”,连 GitHub 工程师 Timothy Clem 自己都吐槽说“用户体验糟糕”。在这种情况下,一些开发者会使用额外的工具查找代码,比如 https://grep.app/ 或 https://sourcegraph.com/search。

实际上,GitHub 在这十几年中一直在努力改进其搜索引擎,第一版搜索引擎通过将所有公共文档索引到 Solr 实例中来工作。对于公共存储库,当时看起来“一切都挺好”,但大型私有存储库仍然无法搜索。

到 2010 年,搜索领域出现了相当大的动荡,Solr 作为一个子项目加入了 Lucene,而 Elasticsearch 作为一种在 Lucene 之上构建和扩展的好方法逐渐兴起。在 2013 年初,GitHub 推出了由 Elasticsearch 集群支持的全新代码搜索,整合了公共和私有存储库的搜索体验并更新了设计。

“当我们第一次部署 Elasticsearch 时,花了几个月的时间来索引 GitHub 上的所有代码,当时大约有 800 万个存储库,平均每秒能响应 5 个搜索请求。”

因为运营规模巨大,在发布后的几天或几周内,GitHub 就马上经历了第一次代码搜索中断......

再加上代码库的不断增加,“代码搜索是迄今为止我们运营的最大集群,自发布以来,它的规模又增长了 20-40 倍”,该公司发现现有技术的正常运行已经越来越难以维持,“从 Solr 到 Elasticsearch,我们尝试用各种通用文本搜索产品来支持代码搜索,但效果都不好。除用户体验糟糕之外,托管成本还非常昂贵,而且索引速度也很慢。”

他们意识到,代码搜索与一般文本搜索有着很大的区别,毕竟代码是写给机器来理解的,需要利用代码之间的结构和相关性,并且还需要支持正则表达式进行搜索。

“归根结底,现成的东西都不能满足我们的需求,所以我们放弃了开源方案,从头开始构建了搜索引擎。”

2、基于 Rust 语言的搜索引擎

从 2020 年开始,GitHub 全力以赴构建自定义搜索引擎。这款代码搜索引擎被命名为 Blackbird,用 Rust 编写,它创建并增量维护一个由 Git blob 对象 ID 分片的代码搜索索引。增量的形式能节省大量存储空间,并保证了跨分片的均匀负载分布。同时支持对文档内容进行正则表达式搜索,还可以捕获额外的元数据,例如它还维护符号定义的索引。最终 Blackbird 满足了大家的性能目标:速度非常快,索引也非常紧凑,重量约为(去重)语料库大小的 1/3。

本周一,Clem 发布了一篇博文,讲述了 Blackbird 的工作原理,深入探讨了这个可对四分之一代码仓库进行搜索的新技术。

Blackbird 目前可对近 4500 万个 GitHub 代码仓库进行访问,涵盖的代码总体量达 115 TB、涉及 155 亿份文档。要在这么多行代码之间切换,单靠 grep(类 Unix 系统上用于搜索文本数据的常用命令行工具)显然是远远不够的。

Clem 解释道,在 8 核英特尔 CPU 上,通过 ripgrep 对内存内的 13 GB 文件执行详尽的正则表达式查询大约需要 2.769 秒,相当于 0.6 GB/ 秒 / 核心。

“我们很快意识到,面对 GitHub 所拥有的大量数据来说,用 grep 的办法根本行不通。代码搜索实际运行在每节点 64 核、总计 32 节点的集群之上。即使我们设法将 115 TB 的代码全放进内存并实现了完美并行查询,那 2048 个 CPU 也要饱和运行 96 秒才能完成一次查询!在此期间,只有当前查询可以运行,其他操作全都得排队。”

每秒只能执行 0.01 次查询,这就直接给 grep 判了死刑。

于是,GitHub 决定将大部分工作预加载至预先计算出的搜索索引当中,这些索引本质上属于键值对映射。如此一来,我们就能使用数字键(而非文本字符串)来搜索编程语言或单词序列等文档特征,从而大大降低对计算资源的需求。

尽管如此,这些索引还是太大、远远超出了内存容量。因此 GitHub 又为需要访问的各个索引构建了迭代器。根据 Clem 的介绍,这些迭代器会延迟返回经过排序的文档 ID,而各 ID 所代表的正是关联文档的级别和满足的查询条件。

为了保持搜索索引的可管理性,GitHub 采取分片方法——使用 Git 的内容可寻址哈希 schema 与增量编码将数据拆分成多个部分,借此存储数据差异(增量)以减少需要抓取的数据和元数据。考虑到 GitHub 上存放着大量冗余数据(例如不同 fork),这套方案确实效果拔群,一举通过重复数据删除技术将 115 TB 数据缩减至 25 TB。

最终系统的运行速度要远超 grep,将最初可怜的每秒 0.01 次查询提升至每秒 640 次查询。此外,索引的执行速度可达到每秒约 12 万个文档,所以处理全部 155 亿个文档需要约 36 个小时。而由于增量(变更)索引减少了所需抓取的文档数量,重新索引只需要 18 个小时。

GitHub Code Search 目前处于 beta 测试阶段,感兴趣的朋友可以点击此处前往体验(https://github.com/features/code-search)。

参考链接:

https://github.blog/2021-12-15-a-brief-history-of-code-search-at-github/

https://www.theregister.com/2023/02/07/github_code_search/?td=rt-3a

https://github.blog/2023-02-06-the-technology-behind-githubs-new-code-search/

RK3568 低功耗设计全解析:DVFS 策略与 PMIC 电源管理 本文深入解析RK3568处理器的低功耗优化方案。从硬件架构分析入手,阐述四核Cortex-A55的功耗特性及分层电源域设计。重点介绍DVFS动态调压调频技术,包括Linux内核配置方法及场景化策略设计。详细讲解RK809 PMIC的电源管理优化,提供外设电源域控制与休眠唤醒配置的实战案例。通过智能终端应用实例,展示待机功耗从280mA降至65mA的优化效果,并推荐功率测试工具。文章强调需要平衡性能与功耗,结合场景定制策略,并指出AI负载预测等未来优化方向,为RK3568开发者提供系统性的低功耗解决方案。 阅读详情

相关推荐

华为防火墙USG6000V---内网访问外网---外网访问内网服务器(NAT服务器)示例配置

华为防火墙USG6000V示例配置,展示了访问防火墙、内网服务器、外网和外网访问内网服务器(NAT服务器)的配置。

lehe99的专栏 2万+

AI在大学申请中为何失效?招生逻辑与技术工具的错位解析

大学本科申请本质上是一场基于行为数据与成长语境的可信度验证,而非文本生成任务。其核心机制——整体性评估(Holistic Review)、时间锚定叙事、多源证据链交叉验证——与AI平台依赖模式匹配、批量生成、通用化表达的技术原理存在根本性冲突。当AI试图替代‘写什么’时,它无法接入申请人真实的课程强度雷达图、活动时间轴、地域资源约束等物理级成长基底。真正有效的技术介入点,在于非创作环节:用大模型做证据链压力测试、语境显性化增强、审核员注意力模拟。这要求申请者从‘AI使用者’转向‘规则解读者’,将工具锚定在真

weixin_33910460的博客 624

电涡流位移测量技术深度解密

电涡流位移传感器凭借非接触测量、高精度(可达纳米级)、强环境适应性(耐高温高压油污)等优势,成为工业精密位移检测的核心技术。其工作原理基于电磁感应:高频磁场在金属靶面感应涡流,通过检测线圈阻抗变化转化为位移信号。应用需注意靶材依赖性(需按实际材料标定)、安装精度及抗干扰措施。广泛应用于磁悬浮轴承、航空发动机、精密制造等领域,实现对微米级位移的可靠监测。

技术工作者 1755

性能提升 40 倍!我们用 Rust 重写了自己的项目

前言Rust 已经悄然成为了最受欢迎的编程语言之一。作为一门新兴底层系统语言,Rust 拥有着内存安全性机制、接近于 C/C++ 语言的性能优势、出色的开发者社区和体验出色的文档、工具链和IDE 等诸多特点。本文将介绍笔者使用 Rust 重写项目并逐步落地生产环境的过程,以及在重写过程选择 Rust 的原因、遇到的问题以及使用 Rust 重写带来的成果。我们目前正在使用 Rust 开发的项目叫做 ...

光谷码农 2433

PCA9548实战:从硬件连接到Linux驱动的I2C扩展全解析

本文详细解析了PCA9548 I2C多路复用器从硬件连接到Linux驱动配置的全过程。涵盖硬件引脚连接、电源去耦、地址选择等关键设计要点,以及Linux驱动加载、设备树配置和应用层编程技巧,帮助开发者高效实现I2C总线扩展。

weixin_28726391的博客 412

Windows 2000系统下载与全套镜像安装:从镜像校验到驱动兼容性实战指南

操作系统镜像文件是安装系统的核心载体,其完整性直接影响部署成败。哈希校验作为验证文件一致性的基础手段,能有效避免因镜像损坏导致的安装中断。对于已停止支持的操作系统,如Windows 2000,其镜像获取与安装更具挑战性,但它在工业控制、专用终端及怀旧技术研究中仍有不可替代的价值。通过理解镜像命名规则、服务包等级(如SP4)及引导方式,结合虚拟机或老硬件平台,可以顺利完成部署。同时,驱动兼容性是老系统运行的关键瓶颈,需针对性解决网卡、显卡等外设驱动问题。本文从镜像下载、校验到安装配置,系统梳理了Windows

weixin_32050773的博客 348

rust资源搜索

需要搜集资料时可能用得上

qingjie0ng的博客 478

Cadence仿真实战:从零构建高精度带隙基准电压源

本文是一份详细的Cadence仿真实战指南,指导读者从零开始构建高精度带隙基准电压源。文章首先解释了带隙基准电压源稳定输出电压的原理,然后逐步演示了在Cadence Virtuoso环境中如何搭建测试电路、测量关键温度系数、计算并搭建核心电路,并通过参数扫描和迭代调优来驯服温度漂移,最终实现低漂移的基准电压输出。

weixin_29207533的博客 243

一次Rust重写基础软件的实践(一)

前言受到2022年“谷歌使用Rust重写Android系统且所有Rust代码的内存安全漏洞为零” [1] 的启发,最近笔者怀着浓厚的兴趣也顺应Rust 的潮流,尝试着将一款C语言开发的基础软件转化为 Rust 语言。本文的主要目的是通过记录此次转化过程中遇到的比较常见且有意思的问题以及解决此问题的方法与大家一起做相关的技术交流和讨论。问题描述在项目转化过程中我遇到了一个与 CAS (Compare...

Rust语言学习交流 986

PCB板质量测试和PCB板

PCB板质量测试和板厂

weixin_51370842的博客 516

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

cargo(rust包管理) 常见命令、包检索 (windows+linux)

rust的cargo包查询方法和基本使用方法

ziqibit的博客 3337

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

耗时18个月,开发者弃TypeScript投Rust,重写系统后痛批:这门语言烂透了!

在近几年的 Stack Overflow 年度开发者调查报告中,有一门编程语言连续多年被评为“最受喜爱的编程语言”——那就是 Rust。凭借其独特的安全性和与 C++ 不逞多让的性能,Rust 成为许多开发者想要尝试的语言,本文作者正是其中一位。而他在用 Rust 重写整个开源算法交易系统后,得出了一个不同于多数人的结论:Rust 这门语言,真的烂透了。作者 | Austin Starks ...

优快云资讯 1039

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【亲测免费】 火热推荐:Rust_Search——闪电般的文件搜索利器

火热推荐:Rust_Search——闪电般的文件搜索利器 在日常开发工作中,快速定位所需文件是提升效率的关键之一。今天,我要向大家强烈推荐一款以Rust语言打造的高性能文件搜索库——Rust_Search。这款工具不仅具备惊人的速度优势,还能提供灵活多样的搜索功能,绝对是每个开发者不可或缺的好帮手。 一、项目介绍 Rust_Search是一款基于Rust语言编写的高速文件搜索包。它以其卓越的性能和...

gitblog_00002的博客 675

我们为什么选 Rust 重写核心服务?

????????关注后回复“进群”,拉你进程序员交流群????????作者丨Simon Chemouil译者丨王强策划丨万佳来源丨架构头条(ID:ArchFront)Simon 是 K...

<sdffdsfsdfdfs>sfsfsfsdfsdffds</sdfsDS>Fsd 612

Windows 11 初尝 Rust,36000 行内核代码已重写!

整理 | 屠敏出品 | 优快云(ID:优快云news)Rust 这两年在大厂的追捧下,凭借着出色的内存效率、速度与安全性,开始爆火。现如今,这把“火”直接烧到了诞生了 40 余载的 Windows 身上!不久之前,微软企业和操作系统安全副总裁 David Weston 在以色列 Blue Hat IL 2023 安全大会上透露,微软将效仿 Linux,用 Rust 重写部分 Windows 内...

优快云资讯 9678

【重磅】用Rust重写Linux内核模块体验

本文来自知乎https://zhuanlan.zhihu.com/p/137077998作者 Kevin Wang最近,我用Rust重写了一个2W+行C代码的linux内核模块。在此记...

Rust语言学习交流 1万+

关于用rust重写软件(包括操作系统)的思考

rust以安全、运行速度、并发、生产力的综合实力展现出来取代c/c++趋势,就像氧化因氧气而无处不在,而且触发了众多大佬大厂重写软件的冲动,其中运行速度媲美了c(排序测试c快了不到百分之十),并发适应了互联网和CPU单核频率提升慢的需求,而安全缩短了测试时间、减少了交付使用后的维护成本而促进了生产力,缺点就是学习曲线陡峭(对于985的计算机本科毕业生或熟悉c++和泛型的学员还是可以学习一个月就参加编程小组),不适合初学者,但悟性高的或高考省内排名一万以内的理工科考生转行计算机的可以学c和泛型后直接过渡到ru

weixin_46348086的博客 2185

Rust学习:14_包和模块

为了学习Rust,阅读了github上的Rust By Practice电子书,本文章只是用来记录自己的学习过程,感兴趣的可以阅读[原书](https://zh.practice.rs/why-exercise.html),希望大家都能掌握Rust!

cacique111的博客 1812

【Rus项目推荐】Rust search extension 0.8发布!快速搜索Rust文档、属性和库的浏览器插件...

Rust Search Extension是一款可以在地址栏快速搜索Rust文档、crates、内置属性和错误码等的浏览器插件,支持Chrome和Firefox,希望能给每一个Rust...

Rust语言学习交流 842

你!们!居!然!用!rust!

今年,Rust无疑是开发者圈子里最火的词之一了。6 月 18 日,Facebook(脸书)发布加密数字货币项目白皮书。该数字货币被命名为 Libra,使用 rust 开...

Rust语言学习交流 1万+

从一个小例子可以看出rust不行

这是我抄的代码: // Tested against syntex_syntax v0.33 extern crate syntex_syntax as syntax; use std::rc::Rc; use syntax::codemap::{CodeMap}; use syntax::errors::{Handler}; use syntax::errors::emitter::{Colo...

个人进步之路 2283

Rust用组合实现java中的继承重写

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33724570的博客 714

【Rust日报】2020-08-01 用 Rust 重写的一系列命令行工具

Rust 调试器库 Headcrab 7月进度报告Headcrab 项目的目标是为 Rust 提供一个新的模块化且可组合的调试器库。从 Delve 和 MDB 等项目中汲取了灵感,大约3...

Rust语言学习交流 1395

我用 Rust 重写了博客,谈谈我眼中的 Rust.

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34268753的博客 1392

用Rust重写Linux内核,这可能吗?

本文转载自 InfoQ,作者万佳、王强 众所周知,Linux 是 C 语言的代言人。但是,时代变了,Rust 正在兴起并赢得越来越多人的支持,它开始逐渐扮演 Linux 系统语言的角色。 在 2020 年 Linux Plumbers 峰会上,开发人员认真考虑过将 Rust 语言用于 Linux 内联代码的想法。此外,已经有很多 Linux 中的 Rust 内容被推向市场。比如,AWS 在 2020 年发布了 Bottlerocket,这是一种专为运行容器而打造的基于 Linux 的开源操作系统,其中.

m0_46163918的博客 1万+
上一篇: 无损压缩鼻祖去世了,没有他就没有今天的Zip、PNG、MP3、PDF……
下一篇: 工程师“魔改” AirPods Pro 接口,苹果“妥协”将成大势所趋?
IT界那些事儿
博客等级 码龄6年 2万+粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值