目錄html
數據的搜索與查找是計算機軟件的核心算法,對海量文檔進行快速檢索,主要使用的就是倒排索引技術。
可能有人會說,咱們平時在MySQL已經能夠直接使用like查詢了,爲啥還要認識叫倒排索引的東西?web
咱們用下面例子說明,假設有一本書,相應頁碼存儲的文章內容以下算法
頁碼 | 內容 |
---|---|
1 | 生命在於運動 |
2 | 運動是生命的源泉 |
3 | 日復一日地堅持練下去吧,只有活動適量才能保持訓練的熱情和提升運動的技能.——塞涅卡 |
4 | 活動是生活的基礎!——歌德 |
5 | 人的健全,不但靠飲食,尤靠運動 |
6 | 奧林匹克的格言是「更高,更快,更強」 |
7 | 身體的健康因靜止不動而破壞,因運動練習而長期保持.——蘇格拉底 |
8 | chenqionghe喜歡運動,繩命是如此的精彩,繩命是如此的輝煌 |
書有不少篇文章,要在一本書中找出全部包含「運動」的文章,只能去一頁頁的翻書,看哪一頁有這個單詞,這種找法實際上是正向索引,即經過文檔(ID)去找單詞。
然而,書越厚,你找的時間越久,由於每次都得找完一本書(這其實也是MySQL中的全表掃描),針對這樣的內容檢索場景,倒排索引就派上用場了。
和正向索引相反,倒排索引是經過單詞去找文檔(ID)。數據庫
倒排索引至關於建立了關鍵詞目錄,記錄了哪一個單詞被哪些文章包含,以下apache
關鍵詞 | 頁碼 |
---|---|
運動 | 1,2,5,8 |
活動 | 3,4 |
生命 | 1,2 |
chenqionghe | 8 |
當咱們要搜索找到有「運動」的文章時,先去關鍵詞目錄找,找到在1,2,5,8這幾頁,而後直接把書翻到這些頁就能獲取到相應的內容了。性能優化
若是咱們要搜索「運動生命」,得先把這個分紅「運動」和「生命」,再分別去目錄找(所以怎麼分詞,也是搜索引擎中的一大藝術)。服務器
倒排索引的原理其實就這麼簡單,驚不驚喜,意不意外~框架
Lucene是目前最爲流行的開放源代碼全文搜索引擎工具包,隸屬於Apache基金會,由資深全文索引/檢索專家Doug Cutting所發起,並以其妻子的中間名做爲項目的名稱。Lucene不是一個具備完整特徵的搜索應用程序,而是一個專一於文本索引和搜索的工具包,可以爲應用程序添加索引與搜索能力。elasticsearch
Elasticsearch是一個基於Lucene的搜索服務器。它提供了一個分佈式多用戶能力的全文搜索引擎,基於RESTful web接口。分佈式
Solr是一個高性能,採用Java開發,基於Lucene的全文搜索服務器,封裝了不少Lucene細節,是一個有HTTP接口的基於Lucene的查詢服務器,
Sphinx是一款基於SQL的高性能全文檢索引擎,利用Sphinx咱們能夠完成比數據庫自己更專業的搜索功能,並且能夠有不少針對性的性能優化。
另外其實MySQL的的全文索引也是基於倒排索引的,能夠參考從零開始學習MySQL全文索引
倒排索引是對互聯網內容的一種索引方法,例如咱們使用百度或者谷歌,就是使用搜索詞搜索到對應的互聯網文檔。
說到大數據,咱們想到的是「三駕馬車」,而這「三駕馬車」最先是谷歌在2003年提出的。
爲了構建倒排索引,谷歌須要存儲整個互聯網的內容,並存儲構建倒排索引所須要的內容,在之前的技術條件,世界上沒有現成的產品能夠實現這種規模的倒排索引。因此,谷歌發明了谷歌文件系統,基於大量的廉價計算機構建的海量存儲系統,對應「三駕馬車」的分佈式存儲系統GFS,開源實現爲HDFS。
從這個GFS中讀取數據作計算,須要一個牛逼的計算框架,這就是「三駕馬車」中的MapReduce,開源實現爲Hadoop MapReduce,後來又出現了Flink、Storm、Spark這樣的新星。
雖然兩駕馬車已經能夠實現存儲互聯網這種海量數據,可是互聯網的內容變化太快,這種系統沒辦法作到增量更新。
這時候,第三駕馬車BigTable出來了,一個Key-Value存儲系統,能夠存儲多個版本的值,對應的開源產品是HBase。
經過這「三駕馬車」,谷歌具有了存儲和分析海量數據的能力,再經過個性化廣告系統不斷地吸金,走在了時代的前沿。當時尚未任何一個公司能在大數據這個領域遇上谷歌,谷歌這個技術也沒有開源。
同時,這「三駕馬車」也是雲計算的重要組成。
後來Hadoop出現了,出現了「三駕馬車」的開源產品:HDFS、MapReduce、HBase。各個公司開始基於Hadoop生態構建出了本身的大數據平臺,谷歌漸漸失去了在大數據時代的先發優點。
有了倒排索引,咱們能夠快速獲得了搜索結果,可是怎麼決定搜索結果的優先級?這時候就用到了一種叫PageRank的算法,計算機網頁的權重,按照權重進行排序,權重越高排得越靠前
關於PageRank的原理能夠參考從小白視角理解 <數據挖掘十大算法>
大道至簡,light weight baby !