当前位置: 首页 > 科技观察

GitHub改代码搜索引擎,18小时给155亿个文档创建索引,背后技术原理已公开

时间:2023-03-13 22:29:09 科技观察

GitHub修改了代码搜索引擎,在18小时内索引了155亿份文档。其背后的技术原理已经公开。还记得GitHub发布的新代码搜索引擎吗?经过一番测试和优化,GitHub现已公开其背后的技术原理。最新版搜索引擎不仅解决了搜索代码时“驴唇不对马嘴”的问题,还可以直接使用正则表达式进行搜索;另外,还解决了部分物品上传后找不到的问题……网友看完技术原理后惊呆了:这真不错!我看到了谷歌代码搜索引擎的影子。其实,我知道做代码搜索引擎的很少有人想去GitHub,但是看到这个功能会变得更好用还是很兴奋的。要知道,GitHub的代码搜索引擎曾被用户吐槽“名存实亡”。很多用户直接自己找了更好的代码搜索引擎,专门搜索自己想要的代码:既然如此,新的GitHub代码搜索引擎使用了什么技术,做了哪些改进?基于Rust语言的搜索引擎GitHub新的代码搜索引擎叫做Blackbird,它的关键在于重建索引。这里主要实现了两类索引,包括正向索引(Forwardindex)和反向索引(Invertedindex)。简单来说,正向索引是指先对数据库中的各种内容进行编号(ID),然后通过这些内容ID来搜索对应的具体内容:这种搜索方式虽然比较直观易懂,但是搜索量大太大了。如果我们只想通过关键字搜索对应的内容,就需要使用倒排索引。反向索引是指通过内容中的关键词直接搜索对应的内容ID,从而第一时间定位到对应的内容。具体到反向索引的实现方法,GitHub采用了一种叫做ngram索引的方法,可以很方便的找到内容的子串。如何理解这个方法?以limits字符串为例,如果ngram中n=3,那么我们可以将其分为四个子串:lim、imi、mit、its。这时候你搜索任意一个字符串,都可以找到对应的内容ID,从而定位到你要搜索的内容。但是GitHub的程序员也意识到这种方式建立的索引太大了,如果真的做这个搜索,服务器会不够用,所以需要优化这种方式。在HackerNews中,一位GitHub程序员对此进行了解释,使用一种叫做coveringsparsengrams(覆盖稀疏ngrams)的方法来生成候选集并搜索相应的内容,其中9代表ch,6代表he,3代表es,以此类推on:一个基于这样的方法的系统如下:那么,新版搜索引擎真的比旧版好吗?测试版体验如何?GitHub目前大约有4500万个存储库、115TB的代码和155亿个文档。据GitHub官方介绍,在改进之前,处理155亿个文档大约需要36个小时。但是,重写代码后,爬取的文档数量减少了50%以上,因此重新索引整个语料库只用了18个小时左右。此外,需要搜索的内容量也减少了很多。最初,要搜索的内容约为115TB。现在,删除重复的内容和数据后,包括索引和内容压缩副本在内的总大小仅为25TB,比之前减少了约25%。目前,测试版仍在开放申请中,已有不少GitHub用户试用。尽管很多用户对新搜索引擎的测试版反响不错,但也有人提出了一些建议。比如现在的代码搜索引擎是没有办法过滤fork项目的。有时使用代码搜索引擎,会找到所有相同的项目。GitHub的程序员也对此进行了反馈,表示之前一直在调整索引,未来会考虑增加这样的功能。此外,也有用户表示,新版GitHub的搜索引擎还是不太好用。它从不区分符号的定义和使用。有时搜索结果往往需要翻5页左右才能找到想要的结果。.对此,有网友推荐了自己常用的代码搜索引擎,比如Sourcegraph。您是否尝试过GitHub的新代码搜索引擎?或者有什么其他好的工具推荐吗?申请试用新代码搜索引擎:https://github.com/features/code-search