作者:憶蓉之心;

來源:Java面試那些事兒

當 Elasticsearch 創始人 Shay Banon 在推文發消息稱他們的公司已在紐交所上市時,就萌生了我寫這篇文章的想法,遲遲未動筆,一直拖到現在。

談談我與搜索引擎的故事


在我看來, Shay Banon 的成功都源於興趣。正如 Shay Banon 曾說過的,他爲了給他的妻子做一款食譜搜索引擎的過程中,發現 Lucene 太難用了,才萌生了寫 Elasticsearch 的決定,見下文。

許多年前,一個剛結婚的名叫 Shay Banon 的失業開發者,跟着他的妻子去了倫敦,他的妻子在那裏學習廚師。 在尋找一個賺錢的工作的時候,爲了給他的妻子做一個食譜搜索引擎,他開始使用 Lucene 的一個早期版本。直接使用 Lucene 是很難的,因此 Shay 開始做一個抽象層,Java 開發者使用它可以很簡單的給他們的程序添加搜索功能。 他發佈了他的第一個開源項目 Compass。後來 Shay 獲得了一份工作,主要是高性能,分佈式環境下的內存數據網格。這個對於高性能,實時,分佈式搜索引擎的需求尤爲突出, 他決定重寫 Compass,把它變爲一個獨立的服務並取名 Elasticsearch。第一個公開版本在2010年2月發佈,從此以後,Elasticsearch 已經成爲了 Github 上最活躍的項目之一,他擁有超過300名 contributors(目前736名 contributors )。 一家公司已經開始圍繞 Elasticsearch 提供商業服務,並開發新的特性,但是,Elasticsearch 將永遠開源並對所有人可用。據說,Shay 的妻子還在等着她的食譜搜索引擎…


在此,不得不說 Shay Banon 是一名成功的程序員,能抓住用戶的痛點,並把這一業餘興趣項目作爲一款開源產品,最終組建公司併成功上市敲鐘,一個字,牛。

我接觸搜索引擎的經歷,應該跟大多數讀者一樣,最早接觸的百度、搜狗、Bing、雅虎,後來學會了翻牆,開始接觸了谷歌,慢慢意識到隱私的重要性,開始玩 DuckDuckGo,做安全的那幾年,對 Shodan、Zoomeye、Fofa 也有一些接觸。

對於上面的這些搜索引擎,都離不開這幾個核心元素,爬取,數據中心,鏈接分析,索引,搜索。只不過上面這些搜索引擎之所以能夠處理數以億計的網頁,在於它的那些模塊使用了分佈式。

我還記得第一次對搜索引擎背後的原理感興趣,是來自大學室友跟他導師做的一個關於 BT 種子搜索的項目。幾十萬的數據輸入一個關鍵字,那麼一瞬間就給出結果了,由於當時我只接觸過數據庫,一直追問他是怎麼建索引的,後來從他的口中,知道一個新名詞 Lucene。

說到 Lucene,不得不提它的創始人 Doug Cutting,他對整個開源社區的影響應該說是巨大的,因爲他後來相繼寫出了 Nutch、Hadoop 等相關開源項目。如果沒有他的 Lucene 也就不會有現如今的 Elasticsearch,更不會有大數據的快速發展。

我大學期間也研究過 MySQL、 Lucene,瞭解到 MySQL 用 B+Tree 做爲索引結構,而 Lucene 用的是倒排索引,它們不是一回事。後來工作中使用過 Elasticsearch,發現它是在 Lucene 的基礎上發展起來的,但是比 Lucene 更加易用,更適用於海量數據。

本文餘下的篇幅主要來談倒排序原理及 Elasticsearch 的生態。


倒排索引原理

我相信很多讀者跟我當初第一次接觸搜索引擎一樣,會思考,爲什麼查詢一片文檔中的關鍵詞,使用 Elasticsearch 遠比使用 MySQL like 查詢快?有的讀者會說 Elasticsearch 是搜索引擎,這個回答沒錯,那爲什麼搜索引擎可以秒級內將關鍵詞從海量文檔中檢索出來?關鍵原因在於它使用了倒排索引技術。

倒排索引是相對於傳統正向索引來說的,傳統的索引技術基本都是文章索引到關鍵詞,因此,查找關鍵詞需要一片一片的去查找匹配,就像 MySQL like 查詢模式,而倒排索引是通過關鍵詞去找文檔的技術。

那麼什麼是倒排索引?舉個例子,我們這裏有兩個文檔「Document」,如下。

談談我與搜索引擎的故事

在存入 Elasticsearch 時,被 ES 根據分詞器去建立索引,所謂分詞器,即將一句話按照語義或單詞進行切分,上述文檔會被分詞器切分成如下列表「這裏不討論 ES 分詞器對於語氣組詞等的處理,感興趣的可以學習 IK 中文分析器」:

談談我與搜索引擎的故事

然後將這些單詞與文檔號進行對應存儲,即可生成 ES 的倒排索引表:

談談我與搜索引擎的故事

這樣,就形成了一個關鍵詞與文檔號對應的倒排索引表,這樣在用戶搜索一些關鍵詞時,就可以通過與倒排索引匹配快速定位到對應的文檔,這就是搜索引擎的模型,當然 ES 的實際實現非常複雜,還需考慮分片、索引位置、持久化存儲類型等諸多問題,這裏就不展開講了。

看到這裏,相信你對倒排序的原理有了初步的理解,感興趣,可以去讀讀 Lucene 的源碼,相信你會有不少的收穫。

Elasticsearch 的生態

對於後端開發程序員來說,可能 ES 的接觸並不是很多,很多使用場合也僅僅侷限於搜索,實際上 ES 除了其強大的搜索能力,還有很多其他特性,如強大的統計與聚合的能力。

在我看來,它是一個較爲全能的 NOSQL 數據庫,在安全分析「IDS、IPS、日誌分析」系統中,ELK 框架至少可以在 50% 的系統中見到。ES 相對於非格式化數據擁有很強的包容性,雖然查詢性能相對於 MySQL 來說較慢「在高版本中,ES 引入了緩存機制,使得 ES 的查詢數據得到了很大的改善」,但對於秒級場景 ES 應對起來還是搓搓有餘的,所以「全能」是 ES 快速得到安全行業青睞的原因。如基於 ELK 的主機安全系統應用 Wazuh,見下圖。


談談我與搜索引擎的故事



根據最新的數據庫搜索引擎排名,可以發現 ES 表現出強勁的走勢,位居第一。


談談我與搜索引擎的故事



最後,我想說,Elasticsearch 的成功並不是那麼容易可以模仿的,各位讀者可以多學習一下這些優秀的開源產品背後的原理,畢竟技多不壓身,只會給你下次找工作增加籌碼。

.....

10 月 20 日,@梓泉&乎睿數據 捅了「馬蜂窩」的事件,想必大家都已經知道了,其實數據造假在整個行業「大到企業,小到個人公衆號」已經心照不宣了,項目前期冷啓動階段,爬競爭對手的數據,似乎很多企業都這麼幹過,但馬蜂窩過了冷啓動階段,還這麼幹,真心說不過去。。。

參考https://www.elastic.co/guide/cn/elasticsearch/guide/current/intro.htmlhttp://lucene.apache.orghttps://en.wikipedia.org/wiki/Doug_Cutting
相關文章