搜索引擎技術之概要預覽

前言

    近些天在學校靜心複習功課與梳理思路(找工作的事情暫緩),趁閒暇之際,常看有關搜索引擎相關技術類的文章,接觸到不少此前未曾觸碰到的諸多概念與技術,如爬蟲,網頁抓取,分詞,索引,查詢,排序等等,更驚歎於每一幅精彩的架構圖,特此,便有記錄下來的衝動,以作備忘。

    本文從最基本的搜索引擎的概念談起,到全文檢索的概念,由網絡蜘蛛,分詞技術,系統架構,排序的講解(結合google搜索引擎的技術原理),而後到圖片搜索的原理,最終以幾個開源搜索引擎軟件的介紹結束全文。

    由於本文初次接觸此類有關搜索引擎的技術,參考和借鑑了互聯網上諸多牛人的文章與作品,有不妥之處,還望諸君海涵。再者因本人見識淺薄,才疏學淺,有任何問題或錯誤,歡迎不吝指正。同時,正式進軍搜索引擎領域的學習與研究。謝謝。

1、什麼是搜索引擎

    搜索引擎指自動從因特網蒐集信息,經過一定整理以後,提供給用戶進行查詢的系統。因特網上的信息浩瀚萬千,而且毫無秩序,所有的信息像汪洋上的一個個小島,網頁鏈接是這些小島之間縱橫交錯的橋樑,而搜索引擎,則爲用戶繪製一幅一目瞭然的信息地圖,供用戶隨時查閱。

    搜索引擎的工作原理以最簡單的語言描述,即是:

  1. 蒐集信息:首先通過一個稱爲網絡蜘蛛的機器人程序來追蹤互聯網上每一個網頁的超鏈接,由於互聯網上每一個網頁都不是單獨存在的(必存在到其它網頁的鏈接),然後這個機器人程序便由原始網頁鏈接到其它網頁,一鏈十,十鏈百,至此,網絡蜘蛛便爬滿了絕大多數網頁。
  2. 整理信息:搜索引擎整理信息的過程稱爲“創建索引”。搜索引擎不僅要保存蒐集起來的信息,還要將它們按照一定的規則進行編排。這樣,搜索引擎根本不用重新翻查它所有保存的信息而迅速找到所要的資料。
  3. 接受查詢:用戶向搜索引擎發出查詢,搜索引擎接受查詢並向用戶返回資料。搜索引擎每時每刻都要接到來自大量用戶的幾乎是同時發出的查詢,它按照每個用戶的要求檢查自己的索引,在極短時間內找到用戶需要的資料,並返回給用戶。
    整理信息及接受查詢的過程,大量應用了文本信息檢索技術,並根據網絡超文本的特點,引入了更多的信息。接下來,下文便由網絡蜘蛛,分詞技術,到系統架構,排序一一介紹。

2、網絡蜘蛛

    網絡蜘蛛即Web Spider,是一個很形象的名字。把互聯網比喻成一個蜘蛛網,那麼Spider就是在網上爬來爬去的蜘蛛。網絡蜘蛛是通過網頁的鏈接地址來尋找網頁,從網站某一個頁面(通常是首頁)開始,讀取網頁的內容,找到在網頁中的其它鏈接地址,然後通過這些鏈接地址尋找下一個網頁,這樣一直循環下去,直到把這個網站所有的網頁都抓取完爲止。如果把整個互聯網當成一個網站,那麼網絡蜘蛛就可以用這個原理把互聯網上所有的網頁都抓取下來。

    在抓取網頁的時候,網絡蜘蛛一般有兩種策略:廣度優先和深度優先(如下圖所示)。廣度優先是指網絡蜘蛛會先抓取起始網頁中鏈接的所有網頁,然後再選擇其中的一個鏈接網頁,繼續抓取在此網頁中鏈接的所有網頁。這是最常用的方式,因爲這個方法可以讓網絡蜘蛛並行處理,提高其抓取速度。深度優先是指網絡蜘蛛會從起始頁開始,一個鏈接一個鏈接跟蹤下去,處理完這條線路之後再轉入下一個起始頁,繼續跟蹤鏈接。這個方法有個優點是網絡蜘蛛在設計的時候比較容易。至於兩種策略的區別,下圖的說明會更加明確。


    由於不可能抓取所有的網頁,有些網絡蜘蛛對一些不太重要的網站,設置了訪問的層數。例如,在上圖中,A爲起始網頁,屬於0層,B、C、D、E、F屬於第1層,G、H屬於第2層,I屬於第3層。如果網絡蜘蛛設置的訪問層數爲2的話,網頁I是不會被訪問到的。這也讓有些網站上一部分網頁能夠在搜索引擎上搜索到,另外一部分不能被搜索到。 對於網站設計者來說,扁平化的網站結構設計有助於搜索引擎抓取其更多的網頁。

3、中文分詞

    下圖是我無聊之際,在百度,谷歌,有道,搜狗,搜搜,雅虎中搜索:結構之法的搜索結果比較(讀者可以永久在百度或谷歌中搜索:結構之法4個字,即可進入本博客):

    從上圖可以看出,百度,谷歌,搜狗,搜搜,雅虎都在第一個選項鍊接到了本博客--結構之法算法之道,從上面的搜索結果來看,百度給的結果是最令我滿意的(幾個月前,谷歌的搜索結果是最好的),其次是雅虎英文搜索,谷歌,而有道的搜索結果則差強人意。是什麼影響了這些搜索引擎搜索的質量與相關性的程度呢?答曰:中文分詞。下面,咱們來具體瞭解什麼是中文分詞技術。

    中文分詞技術屬於自然語言處理技術範疇,對於一句話,人可以通過自己的知識來明白哪些是詞,哪些不是詞,但如何讓計算機也能理解?其處理過程就是分詞算法。
    現有的分詞算法可分爲三大類:基於字符串匹配的分詞方法、基於理解的分詞方法和基於統計的分詞方法。

    1、基於字符串匹配的分詞方法
    這種方法又叫做機械分詞方法,它是按照一定的策略將待分析的漢字串與一個“充分大的”機器詞典中的詞條進行配,若在詞典中找到某個字符串,則匹配成功(識別出一個詞)。按照掃描方向的不同,串匹配分詞方法可以分爲正向匹配和逆向匹配;按照不同長度優先匹配的情況,可以分爲最大(最長)匹配和最小(最短)匹配;按照是否與詞性標註過程相結合,又可以分爲單純分詞方法和分詞與標註相結合的一體化方法。常用的幾種機械分詞方法如下:
    1)正向最大匹配法(由左到右的方向);
    2)逆向最大匹配法(由右到左的方向);
    3)最少切分(使每一句中切出的詞數最小)。

    還可以將上述各種方法相互組合,例如,可以將正向最大匹配方法和逆向最大匹配方法結合起來構成雙向匹配法。由於漢語單字成詞的特點,正向最小匹配和逆向最小匹配一般很少使用。一般說來,逆向匹配的切分精度略高於正向匹配,遇到的歧義現象也較少。統計結果表明,單純使用正向最大匹配的錯誤率爲1/169,單純使用逆向最大匹配的錯誤率爲1/245。但這種精度還遠遠不能滿足實際的需要。實際使用的分詞系統,都是把機械分詞作爲一種初分手段,還需通過利用各種其它的語言信息來進一步提高切分的準確率。
    一種方法是改進掃描方式,稱爲特徵掃描或標誌切分,優先在待分析字符串中識別和切分出一些帶有明顯特徵的詞,以這些詞作爲斷點,可將原字符串分爲較小的串再來進機械分詞,從而減少匹配的錯誤率。另一種方法是將分詞和詞類標註結合起來,利用豐富的詞類信息對分詞決策提供幫助,並且在標註過程中又反過來對分詞結果進行檢驗、調整,從而極大地提高切分的準確率。

    2、基於理解的分詞方法
    這種分詞方法是通過讓計算機模擬人對句子的理解,達到識別詞的效果。其基本思想就是在分詞的同時進行句法、語義分析,利用句法信息和語義信息來處理歧義現象。它通常包括三個部分:分詞子系統、句法語義子系統、總控部分。在總控部分的協調下,分詞子系統可以獲得有關詞、句子等的句法和語義信息來對分詞歧義進行判斷,即它模擬了人對句子的理解過程。這種分詞方法需要使用大量的語言知識和信息。由於漢語語言知識的籠統、複雜性,難以將各種語言信息組織成機器可直接讀取的形式,因此目前基於理解的分詞系統還處在試驗階段。

    3、基於統計的分詞方法
    從形式上看,詞是穩定的字的組合,因此在上下文中,相鄰的字同時出現的次數越多,就越有可能構成一個詞。因此字與字相鄰共現的頻率或概率能夠較好的反映成詞的可信度。可以對語料中相鄰共現的各個字的組合的頻度進行統計,計算它們的互現信息。定義兩個字的互現信息,計算兩個漢字X、Y的相鄰共現概率。互現信息體現了漢字之間結合關係的緊密程度。當緊密程度高於某一個閾值時,便可認爲此字組可能構成了一個詞。

    這種方法只需對語料中的字組頻度進行統計,不需要切分詞典,因而又叫做無詞典分詞法或統計取詞方法。但這種方法也有一定的侷限性,會經常抽出一些共現頻度高、但並不是詞的常用字組,例如“這一”、“之一”、“有的”、“我的”、“許多的”等,並且對常用詞的識別精度差,時空開銷大。實際應用的統計分詞系統都要使用一部基本的分詞詞典(常用詞詞典)進行串匹配分詞,同時使用統計方法識別一些新的詞,即將串頻統計和串匹配結合起來,既發揮匹配分詞切分速度快、效率高的特點,又利用了無詞典分詞結合上下文識別生詞、自動消除歧義的優點。

    到底哪種分詞算法的準確度更高,目前並無定論。對於任何一個成熟的分詞系統來說,不可能單獨依靠某一種算法來實現,都需要綜合不同的算法。個人瞭解,海量科技的分詞算法就採用“複方分詞法”,所謂複方,相當於用中藥中的複方概念,即用不同的藥才綜合起來去醫治疾病,同樣,對於中文詞的識別,需要多種算法來處理不同的問題。

4、系統架構

  • 全文檢索

    全文檢索的方法主要分爲按字檢索和按詞檢索兩種。按字檢索是指對於文章中的每一個字都建立索引,檢索時將詞分解爲字的組合。對於各種不同的語言而言,字有不同的含義,比如英文中字與詞實際上是合一的,而中文中字與詞有很大分別。按詞檢索指對文章中的詞,即語義單位建立索引,檢索時按詞檢索,並且可以處理同義項等。英文等西方文字由於按照空白切分詞,因此實現上與按字處理類似,添加同義處理也很容易。中文等東方文字則需要切分字詞,以達到按詞索引的目的,關於這方面的問題,是當前全文檢索技術尤其是中文全文檢索技術中的難點,在此不做詳述。

    全文檢索系統是按照全文檢索理論建立起來的用於提供全文檢索服務的軟件系統。一般來說,全文檢索需要具備建立索引和提供查詢的基本功能,此外現代的全文檢索系統還需要具有方便的用戶接口、面向WWW的開發接口、二次應用開發接口等等。功能上,全文檢索系統核心具有建立索引、處理查詢返回結果集、增加索引、優化索引結構等等功能,外圍則由各種不同應用具有的功能組成。結構上,全文檢索系統核心具有索引引擎、查詢引擎、文本分析引擎、對外接口等等,加上各種外圍應用系統等等共同構成了全文檢索系統。圖1.1展示了上述全文檢索系統的結構與功能。

    在上圖中,我們看到:全文檢索系統中最爲關鍵的部分是全文檢索引擎,各種應用程序都需要建立在這個引擎之上。一個全文檢索應用的優異程度,根本上由全文檢索引擎來決定。因此提升全文檢索引擎的效率即是我們提升全文檢索應用的根本。

  • 搜索引擎與全文檢索的區別

    搜索引擎的門檻到底有多高?搜索引擎的門檻主要是技術門檻,包括網頁數據的快速採集、海量數據的索引和存儲、搜索結果的相關性排序、搜索效率的毫秒級要求、分佈式處理和負載均衡、自然語言的理解技術等等,這些都是搜索引擎的門檻。對於一個複雜的系統來說,各方面的技術固然重要,但整個系統的架構設計也同樣不可忽視,搜索引擎也不例外。

    搜索引擎的技術基礎是全文檢索技術,從20世紀60年代,國外對全文檢索技術就開始有研究。全文檢索通常指文本全文檢索,包括信息的存儲、組織、表現、查詢、存取等各個方面,其核心爲文本信息的索引和檢索,一般用於企事業單位。隨着互聯網信息的發展,搜索引擎在全文檢索技術上逐漸發展起來,並得到廣泛的應用,但搜索引擎還是不同於全文檢索。搜索引擎和常規意義上的全文檢索主要區別有以下幾點:
  1、數據量
  傳統全文檢索系統面向的是企業本身的數據或者和企業相關的數據,一般索引庫規模多在GB級,數據量大的也只有幾百萬條;但互聯網網頁搜索需要處理幾十億的網頁,搜索引擎的策略都是採用服務器羣集和分佈式計算技術。
  2、內容相關性
  信息太多,查準和排序就特別重要,Google等搜索引擎採用網頁鏈接分析技術,根據互聯網上網頁被鏈接次數作爲重要性評判的依據;但全文檢索的數據源中相互鏈接的程度並不高,不能作爲判別重要性的依據,只能基於內容的相關性排序。
  3、安全性
  互聯網搜索引擎的數據來源都是互聯網上公開的信息,而且除了文本正文以外,其它信息都不太重要;但企業全文檢索的數據源都是企業內部的信息,有等級、權限等限制,對查詢方式也有更嚴格的要求,因此其數據一般會安全和集中地存放在數據倉庫中以保證數據安全和管理的要求。
  4、個性化和智能化

  搜索引擎面向的是互聯網訪問者,由於其數據量和客戶數量的限制,自然語言處理技術、知識檢索、知識挖掘等計算密集的智能計算技術很難應用,這也是目前搜索引擎技術努力的方向;而全文檢索數據量小,檢索需求明確,客戶量少,在智能化和個性可走得更遠。

  • 搜索引擎的系統架構

    這裏主要針對全文檢索搜索引擎的系統架構進行說明,下文中提到的搜索引擎如果沒有特殊說明也是指全文檢索搜索引擎。搜索引擎的實現原理,可以看作四步:從互聯網上抓取網頁→建立索引數據庫→在索引數據庫中搜索→對搜索結果進行處理和排序。  
  1、從互聯網上抓取網頁
  利用能夠從互聯網上自動收集網頁的網絡蜘蛛程序,自動訪問互聯網,並沿着任何網頁中的所有URL爬到其它網頁,重複這過程,並把爬過的所有網頁收集到服務器中。

  2、建立索引數據庫
  由索引系統程序對收集回來的網頁進行分析,提取相關網頁信息(包括網頁所在URL、編碼類型、頁面內容包含的關鍵詞、關鍵詞位置、生成時間、大小、與其它網頁的鏈接關係等),根據一定的相關度算法進行大量複雜計算,得到每一個網頁針對頁面內容中及超鏈中每一個關鍵詞的相關度(或重要性),然後用這些相關信息建立網頁索引數據庫。

  3、在索引數據庫中搜索
  當用戶輸入關鍵詞搜索後,分解搜索請求,由搜索系統程序從網頁索引數據庫中找到符合該關鍵詞的所有相關網頁。

  4、對搜索結果進行處理排序
  所有相關網頁針對該關鍵詞的相關信息在索引庫中都有記錄,只需綜合相關信息和網頁級別形成相關度數值,然後進行排序,相關度越高,排名越靠前。最後由頁面生成系統將搜索結果的鏈接地址和頁面內容摘要等內容組織起來返回給用戶。

  下圖是一個典型的搜索引擎系統架構圖,搜索引擎的各部分都會相互交錯相互依賴。其處理流程按照如下描述:

  “網絡蜘蛛”從互聯網上抓取網頁,把網頁送入“網頁數據庫”,從網頁中“提取URL”,把URL送入“URL數據庫”,“蜘蛛控制”得到網頁的URL,控制“網絡蜘蛛”抓取其它網頁,反覆循環直到把所有的網頁抓取完成。

  系統從“網頁數據庫”中得到文本信息,送入“文本索引”模塊建立索引,形成“索引數據庫”。同時進行“鏈接信息提取”,把鏈接信息(包括錨文本、鏈接本身等信息)送入“鏈接數據庫”,爲“網頁評級”提供依據。

  “用戶”通過提交查詢請求給“查詢服務器”,服務器在“索引數據庫”中進行相關網頁的查找,同時“網頁評級”把查詢請求和鏈接信息結合起來對搜索結果進行相關度的評價,通過“查詢服務器”按照相關度進行排序,並提取關鍵詞的內容摘要,組織最後的頁面返回給“用戶”。

  • 搜索引擎的索引和搜索

    下面咱們以Google搜索引擎爲例主要介紹搜索引擎的數據索引和搜索過程。

  數據的索引分爲三個步驟:網頁內容的提取、詞的識別、標引庫的建立。

  互聯網上大部分信息都是以HTML格式存在,對於索引來說,只處理文本信息。因此需要把網頁中文本內容提取出來,過濾掉一些腳本標示符和一些無用的廣告信息,同時記錄文本的版面格式信息。詞的識別是搜索引擎中非常關鍵的一部分,通過字典文件對網頁內的詞進行識別。對於西文信息來說,需要識別詞的不同形式,例如:單複數、過去式、組合詞、詞根等,對於一些亞洲語言(中文、日文、韓文等)需要進行分詞處理。識別出網頁中的每個詞,並分配唯一的wordID號,用於爲數據索引中的標引模塊服務。

  標引庫的建立是數據索引中結構最複雜的一部分。一般需要建立兩種標引:文檔標引和關鍵詞標引。文檔標引分配每個網頁一個唯一的docID號,根據docID標引出在這個網頁中出現過多少過wordID,每個wordID出現的次數、位置、大小寫格式等,形成docID對應wordID的數據列表;關鍵詞標引其實是對文檔標引的逆標引,根據wordID標引出這個詞出現在那些網頁(用wordID表示),出現在每個網頁的次數、位置、大小寫格式等,形成wordID對應docID的列表。

  搜索的處理過程是對用戶的搜索請求進行滿足的過程,通過用戶輸入搜索關鍵字,搜索服務器對應關鍵詞字典,把搜索關鍵詞轉化爲wordID,然後在標引庫中得到docID列表,對docID列表進行掃描和wordID的匹配,提取滿足條件的網頁,然後計算網頁和關鍵詞的相關度,根據相關度的數值返回前K篇結果(不同的搜索引擎每頁的搜索結果數不同)返回給用戶。如果用戶查看的第二頁或者第多少頁,重新進行搜索,把排序結果中在第K+1到2*K的網頁組織返回給用戶。其處理流程如下圖所示:

5、排序技術

  • Google成功的祕密
    到2004年爲止,Google( http://www.google.com )已經連續兩年被評爲全球第一品牌,Google成立僅五年時間,最初只是兩個斯坦福大學學生的研究項目。這不能不說是一個奇蹟,就像比爾?蓋茨創制奇蹟一樣。比爾?蓋茨能創造奇蹟,是因爲他看準了個人計算機軟件市場的趨勢,所以創建的公司叫Microsoft(微軟):Micro(小)Soft(軟件)。那麼Google呢?在Google出來之前已經有一些很有成就的搜索引擎公司,其實力也很強,看來不只是Google看見了搜索的趨勢。Google究竟成功的祕密在哪兒?

    Google的成功有許多因素,最重要的是Google對搜索結果的排序比其它搜索引擎都要好。Google保證讓絕大部分用搜索的人,都能在搜索結果的第一頁找到他想要的結果。客戶得到了滿足,下一次還過來,而且會向其他人介紹,這一來一往,使用的人就多了。所以Google在沒有做任何廣告的前提下,讓自己成爲了全球最大的品牌。Google究竟採用了哪種排序技術?PageRank,即網頁級別。

    Google有一個創始人叫Larry Page,據說PageRank的專利是他申請的,於是依據他的名字就有了Page Rank。國內也有一家很成功的搜索引擎公司,叫百度( http://www.baidu.com )。百度的創始人李彥宏說,早在1996年他就申請了名爲超鏈分析的專利,PageRank的原理和超鏈分析的原理是一樣的,而且PageRank目前還在Paten-pending(專利申請中)。言下之意是這裏面存在專利所有權的問題。這裏不討論專利所有權,只是從中可看出,成功搜索引擎的排序技術,就其原理上來說都差不多,那就是鏈接分析。超鏈分析和PageRank都屬於鏈接分析。

    鏈接分析到底爲何物?由於李彥宏的超鏈分析沒有具體的介紹,筆者唯一看過的就是在美國專利局網站上關於李彥宏的專利介紹。PageRank的介紹倒是不少,而且目前Google畢竟是全球最大的搜索引擎,這裏以PageRank爲代表,詳細介紹鏈接分析的原理。
  • PageRank揭祕
    PageRank的原理類似於科技論文中的引用機制:誰的論文被引用次數多,誰就是權威。說的更白話一點:張三在談話中提到了張曼玉,李四在談話中也提到張曼玉,王五在談話中還提到張曼玉,這就說明張曼玉一定是很有名的人。在互聯網上,鏈接就相當於“引用”,在B網頁中鏈接了A,相當於B在談話時提到了A,如果在C、D、E、F中都鏈接了A,那麼說明A網頁是最重要的,A網頁的PageRank值也就最高。

    如何計算PageRank值有一個簡單的公式 :

    其中:係數爲一個大於0,小於1的數。一般設置爲0.85。網頁1、網頁2至網頁N表示所有鏈接指向A的網頁。

由以上公式可以看出三點 :

  1. 鏈接指向A的網頁越多,A的級別越高。即A的級別和指向A的網頁個數成正比,在公式中表示,N越大, A的級別越高;
  2. 鏈接指向A的網頁,其網頁級別越高, A的級別也越高。即A的級別和指向A的網頁自己的網頁級別成正比,在公式中表示,網頁N級別越高, A的級別也越高;
  3. 鏈接指向A的網頁,其鏈出的個數越多,A的級別越低。即A的級別和指向A的網頁自己的網頁鏈出個數成反比,在公式中現實,網頁N鏈出個數越多,A的級別越低。
    每個網頁有一個PageRank值,這樣形成一個巨大的方程組,對這個方程組求解,就能得到每個網頁的PageRank值。互聯網上有上百億個網頁,那麼這個方程組就有上百億個未知數,這個方程雖然是有解,但計算畢竟太複雜了,不可能把這所有的頁面放在一起去求解的。對具體的計算方法有興趣的朋友可以去參考一些數值計算方面的書。

    總之,PageRank有效地利用了互聯網所擁有的龐大鏈接構造的特性。 從網頁A導向網頁B的鏈接,用Google創始人的話講,是頁面A對頁面B的支持投票,Google根據這個投票數來判斷頁面的重要性,但Google除了看投票數(鏈接數)以外,對投票者(鏈接的頁面)也進行分析。「重要性」高的頁面所投的票的評價會更高,因爲接受這個投票頁面會被理解爲「重要的物品」。

6、圖片搜索原理

    早有網友阮一峯介紹了一個簡單的圖片搜索原理,可分爲下面幾步:

  1. 縮小尺寸。將圖片縮小到8x8的尺寸,總共64個像素。這一步的作用是去除圖片的細節,只保留結構、明暗等基本信息,摒棄不同尺寸、比例帶來的圖片差異。
  2. 簡化色彩。將縮小後的圖片,轉爲64級灰度。也就是說,所有像素點總共只有64種顏色。
  3. 計算平均值。計算所有64個像素的灰度平均值。
  4. 比較像素的灰度。將每個像素的灰度,與平均值進行比較。大於或等於平均值,記爲1;小於平均值,記爲0。
  5. 計算哈希值。將上一步的比較結果,組合在一起,就構成了一個64位的整數,這就是這張圖片的指紋。組合的次序並不重要,只要保證所有圖片都採用同樣次序就行了。
    這種方法對於尋找一模一樣的圖片是有效的,但並不能夠去搜索“相似”的照片,也不能局部搜索,比如從一個人的單人照找到這個人與別人的合影。這些Google Images都能做到。

    其實早在2008年,Google公佈了一篇圖片搜索的論文(PDF版),和文本搜索的思路是一樣的:

  1. 對於每張圖片,抽取其特徵。這和文本搜索對於網頁進行分詞類似。
  2. 對於兩張圖片,其相關性定義爲其特徵的相似度。這和文本搜索裏的文本相關性也是差不多的。
  3. 圖片一樣有image rank。文本搜索中的page rank依靠文本之間的超鏈接。圖片之間並不存在這樣的超鏈接,image rank主要依靠圖片之間的相似性(兩張圖片相似,便認爲它們之間存在超鏈接)。具有更多相似圖片的圖片,其image rank更高一些。

7、開源搜索引擎

全文檢索引擎 Sphinx

    關注本博客的讀者不知是否還記得曾經出現在這篇文章從幾幅架構圖中偷得半點海量數據處理經驗中的兩幅圖,如下所示:

    上圖出自俄羅斯的開源全文搜索引擎軟件Sphinx,單一索引最大可包含1億條記錄,在1千萬條記錄情況下的查詢速度爲0.x秒(毫秒級)。Sphinx創建索引的速度爲:創建100萬條記錄的索引只需3~4分鐘,創建1000萬條記錄的索引可以在50分鐘內完成,而只包含最新10萬條記錄的增量索引,重建一次只需幾十秒。

     基於以上幾點,一網友回憶未來-張宴設計出了這套搜索引擎架構。在生產環境運行了一週,效果非常不錯。有時間我會專爲配合Sphinx搜索引擎,開發一個邏輯簡單、速度快、佔用內存低、非表鎖的MySQL存儲引擎插件,用來代替MyISAM引擎,以解決MyISAM存儲引擎在頻繁更新操作時的鎖表延遲問題。另外,分佈式搜索技術上已無任何題。

 

    Sphinx是一個基於SQL的全文檢索引擎,可以結合MySQL,PostgreSQL做全文搜索,它可以提供比數據庫本身更專業的搜索功能,使得應用程序更容易實現專業化的全文檢索。Sphinx特別爲一些腳本語言設計搜索API接口,如PHP,Python,Perl,Ruby等,同時爲MySQL也設計了一個存儲引擎插件。

C++檢索引擎 Xapian

    Xapian是一個用C++編寫的全文檢索程序,他的作用類似於Java的lucene。儘管在Java世界lucene已經是標準的全文檢索程序,但是C/C++世界並沒有相應的工具,而Xapian則填補了這個缺憾。 
    Xapian的api和檢索原理和lucene在很多方面都很相似,但是也有一些地方存在不同,具體請看Xapian自己的文檔:http://www.xapian.org/docs/ 
    Xapian除了提供原生的C++編程接口之外,還提供了Perl,PHP,Python和Ruby編程接口和相應的類庫,所以你可以直接從自己喜歡的腳本編程語言當中使用Xapian進行全文檢索了。

Java搜索引擎 Lucene

    Lucene是一套用於全文檢索和搜尋開源程式庫,由Apache軟件基金會支持和提供。Lucene提供了一個簡單確強大的應用程式接口,能夠做全文索引和搜尋,在Java開發環境裏Lucene是一個成熟的免費開放源代碼工具;就其本身而論,Lucene是現在並且是這幾年,最受歡迎的免費java資訊檢索程式庫。人們經常提到資訊檢索程式庫,就像是搜尋引擎,但是不應該將資訊檢索程式庫與網搜索引擎相混淆。

    Lucene最初是由Doug Cutting所撰寫的,是一位資深全文索引/檢索專家,曾經是V-Twin搜索引擎的主要開發者,後來在Excite擔任高級系統架構設計師,目前從事 於一些INTERNET底層架構的研究。他貢獻出Lucene的目標是爲各種中小型應用程式加入全文檢索功能。

C++搜索引擎 CLucene

    CLucene是Lucene的一個C++端口,Lucene是上面所講到的一個基於java的高性能的全文搜索引擎。CLucene因爲使用C++編寫,所以理論上要比lucene快。

搜索引擎 Nutch

    Nutch 是一個開源Java 實現的搜索引擎。它提供了我們運行自己的搜索引擎所需的全部工具。包括全文搜索和Web爬蟲。

    儘管Web搜索是漫遊Internet的基本要求, 但是現有web搜索引擎的數目卻在下降. 並且這很有可能進一步演變成爲一個公司壟斷了幾乎所有的web搜索爲其謀取商業利益.這顯然 不利於廣大Internet用戶.

    Nutch爲我們提供了這樣一個不同的選擇. 相對於那些商用的搜索引擎, Nutch作爲開放源代碼 搜索引擎將會更加透明, 從而更值得大家信賴. 現在所有主要的搜索引擎都採用私有的排序算法, 而不會解釋爲什麼一個網頁會排在一個特定的位置. 除此之外, 有的搜索引擎依照網站所付的 費用, 而不是根據它們本身的價值進行排序. 與它們不同, Nucth沒有什麼需要隱瞞, 也沒有 動機去扭曲搜索的結果. Nutch將盡自己最大的努力爲用戶提供最好的搜索結果.

    Nutch 致力於讓每個人能很容易, 同時花費很少就可以配置世界一流的Web搜索引擎. 爲了完成這一宏偉的目標, Nutch必須能夠做到:

  • 每個月取幾十億網頁
  • 爲這些網頁維護一個索引
  • 對索引文件進行每秒上千次的搜索
  • 提供高質量的搜索結果
  • 以最小的成本運作
    寫博客是一種學習的過程,即便只是參考他人文章的整理總結,也能借鑑他人的經驗,一舉兩得,有何不敢。ok,後續會研究開源搜索引擎的架構設計與源碼學習。搜索引擎技術交流羣:172114338本文完。
發佈了10 篇原創文章 · 獲贊 5 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章