精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

放棄ElasticSearch,GitHub從零打造搜索引擎!2億代碼倉庫怎么搜?

人工智能 新聞
目前GitHub新版搜索引擎已經處于測試階段,只需18小時即可建完4500萬個代碼庫的索引。

2021年12月,GitHub發(fā)布了一次技術預覽(technology preview),針對GitHub代碼搜索「啥也搜不出來」的問題進行了一次全面優(yōu)化。

去年11月,在GitHub Universe開發(fā)者大會上,官方再次發(fā)布了公開測試版,主要解決開發(fā)者尋找、閱讀和導航代碼的問題。

在大會上,有人問了一個重要的問題,「代碼搜索」改進背后的原理到底是什么?

最近,GitHub發(fā)布了一篇博客,詳細解釋了新模型背后的技術原理和系統(tǒng)架構。

從零打造GitHub搜索引擎

簡單來說,新搜索引擎的背后就是研究人員用Rust重新編寫的一個輪子,專門針對代碼搜索進行優(yōu)化,代號黑鳥(Blackbird)

乍一看,從零開始構建搜索引擎似乎是一個令人費解的決定:為什么要從頭再來?現有的開源解決方案不是已經很多了嗎?為什么還要再浪費精力造一個新的東西?

實際上GitHub一直在嘗試使用現有的解決方案來解決搜索問題,但不巧的是,用于通用文本搜索的產品很難適配到「代碼」搜索上。由于索引速度太慢,導致用戶體驗很差,并且所需的服務器數量很大,運行成本也過高。

雖然有一些較新的、專門適配于代碼搜索的開源項目,但它們仍然不適合 GitHub這么大規(guī)模的代碼庫。

基于上述觀察,GitHub的開發(fā)者設定的目標和結論主要有三個:

1. 用戶在搜索過程中能夠得到全新的體驗,可以通過提出一些代碼上的問題來迭代搜索、瀏覽、導航(navigate)和閱讀代碼來得到答案。

2. 代碼搜索與通用文本搜索之間有著許多不同之處。

開發(fā)者編寫代碼是為了讓機器理解,所以代碼搜索的過程應該利用上代碼的結構和相關性;并且用戶可能會搜索標點符號(例如,句號、開括號等代碼中的操作符);不要對代碼中的詞做詞干分析(stemming);不要從query中刪除停止詞;或者使用正則表達式進行搜索。

3. GitHub 的規(guī)模確實是一個獨特的挑戰(zhàn)。

舊版本的搜索引擎使用的是Elasticsearch,第一次部署的時候花了幾個月的時間來索引GitHub上的所有代碼(當時大約有800萬個代碼庫),但現在代碼倉庫數量已經超過了2億,而且這些代碼還不是靜態(tài)的:開發(fā)者不斷提交,代碼也在不斷變化,對于構建搜索引擎來說非常具有挑戰(zhàn)性。

目前在測試版中,用戶可以搜索大約4500萬個代碼庫,包含115TB的代碼和155億個文檔。

綜上所述,現成的東西滿足不了需求,所以,從零開始再造一個。

試試Grep?

在搜索的時候,一個常用的工具就是「grep」,通過輸入表達式,就能在文本中進行匹配,所以為什么不干脆用grep蠻力解決搜索問題?

為了回答這個問題,可以先計算一下用ripgrep對115TB的代碼進行匹配需要多長時間。

圖片

在一臺配備8核 Intel CPU 的機器上,ripgrep 可以在2.769秒內(約0.6 GB/sec/core)對緩存在內存中的13 GB 文件運行正則表達式查詢。

簡單的計算后就能發(fā)現,對于當下的海量數據來說,該方法是行不通的:假設代碼搜索程序運行在一個擁有32臺服務器的集群上,每臺機器有64個核心,即使把115TB的代碼全放到內存里,并且一切運行順利,2,048個 CPU 核大概需要96秒跑完「一個」query,而且只能是一個,其他用戶得排隊,也就是說只有QPS是0.01的話才能用grep

所以蠻力走不通,只能先建一個索引。

搜索索引(serach index)

只有以索引的形式預先計算好相關信息后,才能讓搜索引擎在查詢時快速響應,簡單來說,索引就是一個key-value映射,在倒排索引(inverted index)的情況下,key就是一個關鍵詞,value就是出現該詞的有序文檔ID列表。

在代碼搜索任務中,研究人員用到了一種特殊類型的倒排索引,即ngram索引。

一個 ngram 是長度為 n 的字符序列,例如 n = 3(trigams)意為key的最大長度只能是3,對于較長的key來說,就需要按照長度3進行切割,比如limits就被分為lim, imi, mit和its

執(zhí)行搜索時,綜合多個key的查詢結果,合并后得到該字符串所出現的文檔列表

下一個問題是如何在相對合理的時間內完成索引的構建。

研究人員觀察到:Git 使用內容尋址散列,以及 GitHub 上實際上有相當多的重復內容,所以研究人員提出下面兩個方法建立索引。

1. shard by Git blob object ID 提供了一種在 shards 之間均勻分布文檔的好方法,并且可以避免重復,同時能夠根據需要隨時擴展shards的數量。

2. 將索引建模為樹,并使用差分編碼(delta encoding)來減少crawling的數量并優(yōu)化索引中的元數據,其中元數據包括文檔出現的位置列表(哪個path、分支和代碼庫)以及關于這些對象的信息(代碼庫名稱、所有者、可見性等)。對于一些熱門倉庫來說,元數據量可能會相當大。

GitHub還設計了一個系統(tǒng),使得查詢結果與提交后的代碼保持一致。

如果用戶在團隊成員推送代碼時搜索代碼庫,那么在系統(tǒng)完全處理完新提交的文檔之前,搜索結果中不應該包含這些文檔,Blackbird將commit查詢一致性作為其設計的核心部分。

Blackbird

下面是Blackbird搜索引擎的架構圖。

圖片

首先,Kafka會提供events來指定索引的內容,然后就會有大量的爬蟲(crawler)程序與Git進行交互,其中還有一個從代碼中提取符號的服務;再次使用Kafka對每個shard進行索引,獲取目標文檔。

雖然該系統(tǒng)只是響應像「git push」來抓取更改內容等類似的事件,但在首次ingest所有代碼庫時還需要做一些額外的工作。

該系統(tǒng)的一個關鍵特性就是對初始ingest順序的優(yōu)化以充分利用增量編碼。

GitHub使用了一種全新的概率數據結構來表示代碼庫的相似性,并且通過從代碼庫相似性圖的一個最小生成樹的水平順序遍歷中計算得到ingest的順序。

基于優(yōu)化后的ingest順序,delta 樹的構建過程就是將每個代碼庫與其父代碼庫進行差分,這也意味著該系統(tǒng)只需要抓取當前代碼庫所特有的 blobs,爬取包括從 Git 獲取 blob 內容,分析后提取符號,以及創(chuàng)建將作為索引輸入的文檔。

然后將這些文件發(fā)布到另一個Kafka主題中,也是在shards之間將數據分區(qū)的地方。每個shards使用主題中的一個Kafka分區(qū)。

使用Kafka可以將索引與crawl解耦,并且Kafka中對消息的排序也可以也可以使得查詢結果一致。

然后,indexer shards找到這些文檔并構建索引:tokenizing內容、符號和path以構造 ngram indices和其他有用的indices(語言、所有者、代碼庫等) ,并將結果刷新到磁盤上。

最后,對shards進行壓縮(compaction),將較小的索引折疊成較大的索引,這樣查詢起來更有效,移動起來也更容易。

query的生命周期

有了索引之后,通過系統(tǒng)跟蹤query就變得簡單了,每個query都是一個正則表達式,可以寫作「/arguments?/ org:rails lang:Ruby」,即查找一個由Rails組織用Ruby語言編寫的代碼。

圖片

在 GitHub.com 和shards之間還有一個服務,負責協調接收用戶query,并將請求分散到搜索集群中的每個主機上,最后使用 Redis 來管理磁盤空間(quotas)和緩存一些訪問控制數據。

前端接受一個用戶查詢并將其傳遞給黑鳥,然后將query解析為一個抽象語法樹,將其重寫為規(guī)范的語言 ID,并在額外的子句上標記權限和范圍。

圖片

下一步將發(fā)送 n 個并發(fā)請求: 向搜索集群中的每個shard發(fā)送一個,系統(tǒng)中設定的sharding策略就是向集群中的每個shard發(fā)送查詢請求。

然后,在每個單獨的shard上對查詢進行一些轉換以便在索引中查找信息。

圖片

最后聚合所有shard返回的結果,按分數重新排序,篩選(再次檢查權限) ,并返回 top 100,然后GitHub.com 的前端進行語法突顯、術語高亮、分頁,最后我們才能將結果呈現給頁面。

實際使用中,單個shard的p99響應時間大約是100ms,但是由于聚合response、檢查權限以及語法突顯等原因,總的響應時間要長一些。

一個query在索引服務器上占用一個 CPU 核心100毫秒,因此64個核心主機的上限大約是每秒640個查詢。與 grep 方法(0.01 QPS)相比,這種方法可以說是相當快了。

總結

完整的系統(tǒng)架構介紹完以后,可以重新來審視一下問題的規(guī)模了。

GitHub的ingest pipeline每秒可以發(fā)布大約12萬個文檔,因此全部處理完155億個文檔需要大約36個小時;但是增量索引(delta indexing)可以降低所需抓取的文檔數量的50%以上,使得整個過程可以在大約18小時內重新索引整個語料庫。

在索引規(guī)模方面取得了一些突破,初始的內容量為115TB,刪除重復內容、使用增量索引后將內容的數量減少到28TB左右。

而索引本身只有25TB,其中不僅包括所有索引(含ngram) ,還包括所有唯一內容的壓縮副本,這也意味著包括內容在內的總索引大小大約只有原始數據大小的四分之一!

責任編輯:張燕妮 來源: 新智元
相關推薦

2009-12-24 10:55:08

2017-08-17 16:42:38

Elastic 全文搜索服務器

2018-12-28 09:48:11

SolrElasticSear搜索

2018-07-20 09:42:23

Elasticsear實戰(zhàn)訂單

2021-04-12 10:38:17

ElasticSearSolrJava

2014-11-25 10:09:59

ElasticSear分布式搜索引擎Lucene

2011-06-20 18:23:06

SEO

2023-03-08 17:33:36

KubernetesJava

2017-01-17 15:18:42

2023-05-09 17:22:08

GitHub代碼

2015-08-17 10:34:30

2012-05-01 13:25:32

安卓

2017-08-07 08:15:31

搜索引擎倒排

2023-02-08 10:07:17

GitHub搜索

2020-03-20 10:14:49

搜索引擎倒排索引

2023-07-31 21:52:56

搜索數據方式

2012-09-07 13:22:21

搜索搜狗

2022-10-08 09:13:18

搜索引擎?站

2010-04-20 11:43:46

2009-02-19 09:41:36

搜索引擎搜狐百度
點贊
收藏

51CTO技術棧公眾號

夜夜躁狠狠躁日日躁av| 国产传媒第一页| 99福利在线| caoporen国产精品视频| 国产精品96久久久久久又黄又硬| 丰满少妇一区二区| vam成人资源在线观看| 亚洲在线中文字幕| 日本成人三级电影网站| 国产日韩一级片| 国产精品五区| 波霸ol色综合久久| 国产精品手机在线观看| 日韩毛片在线| 香蕉加勒比综合久久| 日本在线观看不卡| 96亚洲精品久久久蜜桃| 99在线精品免费视频九九视| 日韩综合中文字幕| 国产在线观看无码免费视频| 午夜精品久久久久久毛片| 精品美女永久免费视频| 欧美 日韩 国产 在线观看| 天天操天天干天天爱| 久久99国产精品久久99| 性亚洲最疯狂xxxx高清| 国产精品99久久久久久成人| aaa国产精品视频| 欧美精品少妇一区二区三区 | 日韩一区二区三区在线观看视频| 麻豆精品在线看| 日本亚洲欧美三级| 国产精品第72页| 911精品美国片911久久久| 亚洲免费av网址| 国产精品久久久久久在线观看| 国产亚洲人成a在线v网站| 日韩欧美亚洲成人| 大陆av在线播放| 国产网站在线免费观看| 欧美国产精品专区| 欧美国产一二三区| 天天插天天干天天操| 国产精品中文字幕一区二区三区| 日韩美女主播视频| 中文字幕超碰在线| 一本久道久久久| 欧美精品第一页在线播放| 人妻久久一区二区| 99久久精品网站| 日韩中文字幕免费视频| 中文天堂资源在线| 欧美少妇xxxx| 国产亚洲精品久久久| 全黄一级裸体片| 亚洲人成网亚洲欧洲无码| 亚洲国产精品字幕| 精品视频站长推荐| 欧美在线导航| 国产视频久久网| 午夜理伦三级做爰电影| 久久av中文| 亚洲欧美日韩精品久久亚洲区| 在线观看国产网站| 亚洲aa在线| 国产午夜一区二区| 日本欧美一区二区三区不卡视频| 成人高清av| 精品国内亚洲在观看18黄| av在线免费播放网址| 亚洲中无吗在线| 欧美大片免费观看在线观看网站推荐| 永久免费看黄网站| 亚洲天堂男人| 欧美亚洲免费电影| 波多野结衣视频免费观看| 美腿丝袜一区二区三区| 91香蕉国产在线观看| jlzzjlzzjlzz亚洲人| 成人免费观看视频| 欧美精品久久久| wwwww在线观看免费视频| 国产精品福利一区二区| 一本大道东京热无码aⅴ| 19禁羞羞电影院在线观看| 欧美视频免费在线观看| 狠狠躁狠狠躁视频专区| 玖玖玖电影综合影院| 亚洲国产精品小视频| 手机看片日韩av| 欧美精品福利| 欧美最猛性xxxxx亚洲精品| 亚洲成人av网址| 国产乱对白刺激视频不卡| 蜜桃视频日韩| 免费在线观看黄| 午夜不卡av免费| jizz18女人| 国产三级精品三级在线观看国产| 亚洲视频第一页| 久久久久国产精品夜夜夜夜夜| 国产精品最新自拍| 5566中文字幕一区二区| 国产一级网站视频在线| 亚洲综合色自拍一区| 日本新janpanese乱熟| 亚洲精品黑牛一区二区三区| 亚洲深夜福利视频| 日本少妇毛茸茸高潮| 美国毛片一区二区三区| 精品视频高清无人区区二区三区| 日本视频在线| 欧美日韩在线视频观看| 在线观看中文av| 欧美美女在线观看| 韩国美女主播一区| 国产又黄又猛又爽| 国产亚洲欧美一区在线观看| 国产911在线观看| jizz久久久久久| 日韩精品电影网| 久草网站在线观看| 日韩黄色免费网站| 久久99精品久久久久久久久久| 精品51国产黑色丝袜高跟鞋| 色婷婷狠狠综合| 国产精品扒开腿做爽爽爽a片唱戏 亚洲av成人精品一区二区三区 | 久久偷拍免费视频| 国产精品99一区二区| 国产精品视频网站| 欧美偷拍视频| 午夜视频久久久久久| 天天干天天曰天天操| 日本一二区不卡| 国产福利精品在线| 日韩av视屏| 欧美日韩国产在线播放| 99久久久无码国产精品性波多| 久久久久午夜电影| 国产这里只有精品| 亚洲成人三级| 欧美日韩一区不卡| 蜜桃视频在线观看网站| 国产亚洲欧洲| 国产精品亚洲一区| 免费观看在线黄色网| 欧亚一区二区三区| 国产高潮呻吟久久| 久久国产日本精品| 欧美福利精品| 欧美aa一级| 日韩电影中文字幕一区| 日韩三级av在线| 97精品久久久午夜一区二区三区 | 91精品视频免费观看| 9色在线视频| 欧美日韩精品一区二区三区四区| 亚洲色图第四色| 免费在线看成人av| 在线一区日本视频| 国产一区二区三区精品在线观看| 久久久精品日本| 国产三级小视频| 亚洲乱码精品一二三四区日韩在线| 亚洲综合伊人久久| 欧美淫片网站| 国产欧美欧洲| 中文字幕一区久| 尤物九九久久国产精品的分类| 中文字幕精品在线观看| 国产精品美女久久久久久久网站| 一区二区三区韩国| 羞羞色午夜精品一区二区三区| 91精品啪aⅴ在线观看国产| 日本乱理伦在线| 日韩高清有码在线| 91丝袜一区二区三区| 中文字幕免费在线观看视频一区| 怡红院亚洲色图| 欧美视频日韩| 久久人人爽爽人人爽人人片av| 影视一区二区三区| 久久影视电视剧免费网站清宫辞电视| 性欧美8khd高清极品| 精品日韩视频在线观看| 女人裸体性做爰全过| 国产成人av一区| avav在线看| 婷婷精品进入| 极品日韩久久| 久久女人天堂| 97国产成人精品视频| 国产一区二区影视| 日韩欧美高清在线| 日韩国产成人在线| 亚洲一卡二卡三卡四卡五卡| 日本xxx在线播放| 国产在线视频精品一区| 国产精品333| 91九色精品| 蜜桃av久久久亚洲精品| 亚洲精品aa| 欧美一区亚洲一区| 黄色网页在线播放| 亚洲欧美日韩精品| 成人精品在线播放| 欧美三级午夜理伦三级中视频| 久久免费播放视频| 欧美激情在线看| www.88av| 国产精品1区二区.| 一级黄色香蕉视频| 亚洲人成毛片在线播放女女| 亚洲欧美日韩不卡| 欧美精选视频在线观看| 国产伦精品一区二区三区照片 | 欧美自拍偷拍午夜视频| 久久中文字幕在线观看| 国产精品毛片久久久久久久| 亚洲国产精品成人综合久久久| 国产资源精品在线观看| 色七七在线观看| 国产情侣一区| 亚洲 欧美 综合 另类 中字| 久久综合国产| 五月天久久狠狠| 午夜精品福利影院| 国产三级精品在线不卡| 警花av一区二区三区| 国产精品丝袜一区二区三区| 伊人久久国产| 97视频在线观看视频免费视频| 怡红院红怡院欧美aⅴ怡春院| 最近的2019中文字幕免费一页| 天堂在线中文资源| 亚洲精品720p| 二区三区在线视频| 日韩免费高清视频| 国产激情视频在线播放| 欧美一区二区三区在线看| 伊人22222| 欧美日韩国产美女| 中文字幕码精品视频网站| 色婷婷久久一区二区三区麻豆| 色av性av丰满av| 欧美色播在线播放| 欧美日韩一级黄色片| 色综合久久久久综合| 精品黑人一区二区三区| 色噜噜狠狠成人网p站| 91丝袜一区二区三区| 欧美在线啊v一区| 亚洲中文字幕在线一区| 精品视频在线免费观看| 国产孕妇孕交大片孕| 91麻豆精品国产自产在线观看一区| 国产毛片一区二区三区va在线 | 午夜福利一区二区三区| 亚洲精品一区二区久| 国产高清视频在线观看| 在线看日韩欧美| 国产原创视频在线观看| 色在人av网站天堂精品| 国模私拍一区二区国模曼安| 欧美一级淫片播放口| 97久久网站| 3d动漫精品啪啪一区二区三区免费| 91欧美日韩在线| 久久免费看av| 天天射—综合中文网| 欧美国产综合在线| 亚洲欧美成人| 中文字幕线观看| 成人综合在线网站| 波多野结衣a v在线| 国产精品人妖ts系列视频| 九九热精品在线观看| 婷婷综合五月天| 中文字幕一区二区三区人妻四季| 91麻豆精品国产91久久久使用方法 | 亚洲欧美aⅴ...| 久久久久成人精品无码| 色哟哟日韩精品| 在线观看国产小视频| 欧美一区二区三区系列电影| 农村少妇久久久久久久| 日韩精品视频观看| 五月天久久久久久| xvideos亚洲人网站| av在线免费网址| 日产精品久久久一区二区福利| 日韩一区精品| 2019国产精品视频| 香蕉一区二区| 中文字幕人成一区| 国产精品主播| 亚洲 欧美 另类人妖| 久久国产综合精品| 污污内射在线观看一区二区少妇| 久久日一线二线三线suv| 人人爽人人爽人人片| 一区二区三区国产精品| 天堂在线免费观看视频| 欧美调教femdomvk| 亚洲av无码国产精品久久不卡 | 青青视频在线观| 色噜噜狠狠狠综合曰曰曰| 羞羞的网站在线观看| 国产激情视频一区| 成人国产精品久久| 久久婷婷人人澡人人喊人人爽| 久久精品青草| 国产免费成人在线| 国产成人在线视频网站| av在线播放中文字幕| 亚洲国产va精品久久久不卡综合| 91亚洲欧美激情| 日韩精品视频在线观看网址| 麻豆传媒在线免费| 国产精品丝袜高跟| 欧洲亚洲视频| 日本一道在线观看| 激情小说亚洲一区| 国产特级黄色录像| 舔着乳尖日韩一区| 99久久夜色精品国产亚洲| 亚洲欧美日韩爽爽影院| 不卡视频观看| 亚洲最大成人在线| 不卡视频在线| 国产精品人人妻人人爽人人牛| 成人精品小蝌蚪| 久草视频在线免费看| 欧美男人的天堂一二区| 免费在线黄色网址| 欧美在线性爱视频 | 日本三级视频在线播放| 日韩美女视频中文字幕| 久久aimee| 欧美激情视频免费看| 国产一区啦啦啦在线观看| 波多野在线播放| 91国偷自产一区二区开放时间| 殴美一级特黄aaaaaa| 午夜精品蜜臀一区二区三区免费| 日本精品久久| 日韩精品无码一区二区三区| 亚洲影音先锋| 欧美成人三级伦在线观看| 午夜精品久久久久久久99水蜜桃 | 日韩国产欧美在线视频| 88av在线播放| 精品福利在线视频| 视频一区 中文字幕| 欧美最猛性xxxx| 亚洲老女人视频免费| 欧美一区二区三区综合| 成人一区二区三区| 久久久久久久久久综合 | 欧美一区二区三区图| 伊人成综合网yiren22| 男人天堂999| 国产午夜精品理论片a级大结局| 丁香六月婷婷综合| 亚洲美女av电影| 电影亚洲一区| 中文字幕欧美人与畜| 成人一区二区三区视频| 日韩和一区二区| 日韩电影在线观看中文字幕 | 国产欧美亚洲视频| 成人av二区| 爱情岛论坛亚洲自拍| 一区二区三区免费在线观看| 少妇人妻精品一区二区三区| 91精品国产色综合久久不卡98口| 蜜桃a∨噜噜一区二区三区| 国产精品免费成人| 国产欧美日韩不卡| 99精品免费观看| 久久久噜噜噜久久中文字免| 亚欧洲精品视频在线观看| 成人一区二区三| 亚洲欧洲美洲综合色网| 日韩专区第一页| 国产成人精品a视频一区www| 香蕉av一区二区| 国产吃瓜黑料一区二区| 欧美午夜www高清视频| 日本在线天堂| 国产精品美女xx| 日韩av网站免费在线| 蜜臀av午夜精品久久| 日韩不卡中文字幕| 久久xxx视频| 国产专区在线视频| 国产亚洲污的网站| 99久久婷婷国产一区二区三区| 日本一区二区在线播放| 日韩欧美三级|