[轉載] 搜索引擎技術介紹

轉載自http://backend.blog.163.com/blog/static/202294126201252872124208/前端

需求與歷史
 
搜索引擎的誕生源自互聯網最根本的用途之一:信息獲取。在搜索引擎出現以前,互聯網缺乏入口,用戶每每須要本身記住有用的網站和網頁。
 
爲了知足這種需求,最先的「搜索引擎」,即分類目錄瀏覽式的引擎便出現了,Yahoo就是其中的表明。
當時只是把一些有用的網站經過分類的方式手工組織起來,便於用戶找到有用的信息。
可以手工組織也是基於早年整個互聯網的網站數量也很是少,能夠經過人工方式實現組織。
 
但隨着互聯網的壯大,網頁網站數量愈來愈多,手工組織的方式變爲不可行,因而由機器實現的全文檢索引擎便出現了。
用戶能夠經過關鍵字查詢來獲取相關的網頁。
 
但隨着網頁數量進一步增多,任何關鍵字查詢都會返回大量的相關網頁,若是對網頁進行評分和排序,返回給用戶真正有價值的網頁便成爲重點。
基於網頁之間的連接關係爲網頁進行評分,成爲不少搜索引擎的網頁排序算法基礎,Google的PageRank算法即是其中的表明者和姣姣者。
Google也以此爲基礎成爲搜索引擎產品中的領先者,爲用戶提供了更好的搜索結果相關性。
現代搜索引擎基本上也由此基本成型,雖而後來的技術創新和改進不少,但主要的思路基本上沒有變。
 
搜索引擎發展到今天,基礎架構和算法在技術上都已經基本成型和成熟。現在的一些改進和變化基於在多元化的信息整合,以及產品形態的改進上。
將來會往什麼方向發展,或者有什麼革命的變化,都不能肯定。
 
 
搜索產品
 
搜索引擎產品其實包括不少種類,並不限於咱們最熟悉的全網搜索引擎。
簡單分類羅列一下:
* 全網搜索:包括市場份額最高的幾大搜索引擎巨頭,Google, Yahoo, Bing。
* 中文搜索:在中文搜索市場中,百度一家獨大,其它幾家如搜狗、搜搜、有道,市場份額相對還比較小。
* 垂直搜索:在各自的垂直領域成爲搜索入口的,購物的淘寶,美食的大衆點評,旅遊的去哪兒,等等。
* 問答搜索:專一於爲問句式提供有效的答案,好比Ask.com;其它的如問答社區像Quora和國內的知乎,應該也會往這方面發展。
* 知識搜索:典型表明就是WolframAlpha,區別於提供搜索結果列表,它會針對查詢提供更詳細的整合信息。
* 雲搜索平臺:爲其它產品和應用提供搜索服務託管平臺(SaaS或是PaaS),Amazon剛剛推出它的CloudSearch, IndexTank在被Linkedin收購以前也是作這項服務。
* 其它:比始DuckDuckGo,主打隱私保護,也有部分用戶買賬。
各類搜索產品在各自領域都須要解決特定的技術和業務問題,因此也能夠創建相對通用搜索的優點,來獲得本身的市場和用戶。
 
 
搜索技術
 
搜索引擎所涉及和涵蓋的技術範圍很是廣,涉及到了系統架構和算法設計等許多方面。
能夠說因爲搜索引擎的出現,把互聯網產品的技術水平提升到了一個新的高度;搜索引擎不管是在數據和系統規模,仍是算法技術的研究應用深度上,都遠超以前的簡單互聯網產品。
 
列舉一些搜索引擎所涉及到的技術點:
* 爬蟲 (Crawling)
* 索引結構 (Inverted Index)
* 檢索模型 (VSM & TF-IDF)
* 搜索排序 (Relevance Ranking & Evaluation)
* 連接分析 (Link Analysis)
* 分類 (Document & Query Classification)
* 天然語言處理 (NLP: Tokenization, Lemmatization, POS Tagging, NER, etc.)
* 分佈式系統 (Distributed Processing & Storage)
* 等等
 
雖然搜索引擎涉及的技術方方面面,但歸結起來最關鍵的幾點在於:
* 系統:大規模分佈式系統,支撐大規模的數據處理容量和在線查詢負載
* 數據:數據處理和挖掘能力
* 算法:搜索相關性排序,查詢分析,分類,等等
 
系統
搜索引擎系統是一個由許多模塊組成的複雜系統。
核心模塊一般包括:爬蟲,索引,檢索,排序。
除了必需的核心模塊以外,一般還須要一些支持輔助模塊,常見的有連接分析,去重,反垃圾,查詢分析,等等。
 
[附圖:搜索系統架構概念模型]
搜索引擎技術介紹 - yinan - Yinan的博客
 
簡單介紹一下搜索系統的概念模型中的各模塊:
 
* 爬蟲
從互聯網爬取原始網頁數據,存儲於文檔服務器。
 
* 文檔服務器
存儲原始網頁數據,通宵是分佈式Key-Value數據庫,能根據URL/UID快速獲取網頁內容。
 
* 索引
讀取原始網頁數據,解析網頁,抽取有效字段,生成索引數據。
索引數據的生成方式一般是增量的,分塊/分片的,並會進行索引合併、優化和刪除。
生成的索引數據一般包括:字典數據,倒排表,正排表,文檔屬性等。
生成的索引存儲於索引服務器。
 
* 索引服務器
存儲索引數據,主要是倒排表。
一般是分塊、分片存儲,並支持增量更新和刪除。
數據內容量很是大時,還根據類別、主題、時間、網頁質量劃分數據分區和分佈,更好地服務在線查詢。
 
* 檢索
讀取倒排表索引,響應前端查詢請求,返回相關文檔列表數據。
 
* 排序
對檢索器返回的文檔列表進行排序,基於文檔和查詢的相關性、文檔的連接權重等屬性。
 
* 連接分析
收集各網頁的連接數據和錨文本(Anchor Text),以此計算各網頁連接評分,最終會做爲網頁屬性參與返回結果排序。
 
* 去重
提取各網頁的相關特徵屬性,計算類似網頁組,提供離線索引和在線查詢的去重服務。
 
* 反垃圾
收集各網頁和網站歷史信息,提取垃圾網頁特徵,從而對在線索引中的網頁進行斷定,去除垃圾網頁。
 
* 查詢分析
分析用戶查詢,生成結構化查詢請求,指派到相應的類別、主題數據服務器進行查詢。
 
* 頁面描述/摘要
爲檢索和排序完成的網頁列表提供相應的描述和摘要。
 
* 前端
接受用戶請求,分發至相應服務器,返回查詢結果。
 
[附圖:爬蟲系統架構]
搜索引擎技術介紹 - yinan - Yinan的博客
 
爬蟲系統也是由多個模塊構成:
 
* URL Scheduler
存儲和高度待爬取的網頁地址。
 
* Downloader
根據指定的網頁列表爬取網頁內容,存儲至文檔服務器。
 
* Processer
對網頁內容進行簡單處理,提取一些原始屬性,爲爬取的後續操做服務。
 
* Traffic Controller
爬取流量控制,防止對目標網站在短期內形成過大負載。
 
[附圖:搜索系統架構實例:Google]
搜索引擎技術介紹 - yinan - Yinan的博客
這是Google早期的一張系統架構圖,能夠看出Google系統的各模塊基本和前面概念模型一致。
因此一個完整的全網搜索系統的大體系統架構是相似的,區別和競爭力體如今細節實現和優化上。
 
數據
除了搜索引擎系統提供了系統支撐外,搜索結果質量很大程度上依賴於源數據的數量和質量,以及數據處理的能力。
 
全網數據的主要來源一般是從互聯網上進行自動爬取,從一些高質量的種子站點開始,並沿網頁連接不斷展開,收集巨量的網頁數據;這一般能達到數據在數量的要求,但也不可避免混入了大量的低質量網頁。
除了自動爬取來的數據外,搜索引擎的數據來源還能夠來自人工收集、合做夥伴提供、第三方數據源和API、以及購買;這些來源一般會有更好的質量保證,但在數量規模和覆蓋率上會相對少一些,能夠和爬取的數據造成有效的互補。
 
收集到足量的原始數據後,須要進行各類數據處理操做,把原始數據轉換成在線檢索須要的數據。
這個過程一般包括:網頁分析,數據抽取,文本處理和分詞,索引及合併;最終生成的數據會包括:詞典,倒排表,正排表,文檔權重和各類屬性。
 
最終生成的數據要佈署上相應的在線檢索服務器上,一般會進行數據分區和分片佈署,數據內容更豐富時還可能根據內容分類和主題進行分別佈署,好比新聞時效類的網頁可能就會獨立佈署,針對性地響應時效類的查詢。
 
[附圖:索引數據:字典、倒排表、正排表]
搜索引擎技術介紹 - yinan - Yinan的博客
這張圖來源於Google早期的索引數據結構,包括詞典、倒排表、正排表。
 
算法
有了至關數量的高質量數據以後,搜索結果的質量改進就取決於搜索算法的準確性上。
 
如今的搜索引擎一般經過向量空間模型(VSM = Vector Space Model)來計算查詢和各文檔之間的文本類似性;即把查詢或文檔抽象成一個詞向量,而後再計算向量在向量空間中的夾角,能夠用餘弦公式得出,做爲文本類似度的度量值。
在 基本的向量空間模型基礎上一般會進一步加入詞的權重值進行改進,經過經典的TF-IDF公式得出,即詞頻(TF)乘上逆文檔頻率(IDF);其中TF = Term Frequency,即該詞在所在文檔中的出現次數;IDF = Invert Document Frequency,即包含該詞的文檔數除以總文檔數,再取反,一般還會取對數來降維,這個值值越大表示這個詞越能表明文檔特徵。
 
除了經過向量空間模型得出的文本匹配評分外,每一個文檔還會有本身自己的質量評分,一般由網頁連接數據計算得出,表明了該網頁自己的流行度權重。
最終的評分會以文本匹配的查詢時動態評分和文檔靜態評分爲基礎計算得出;搜索引擎的評分計算都會考慮不少因素,但這兩項一般是評分計算的基礎。
 
有了肯定的排序算法後,另外一個重要的任務就是評估搜索結果的質量。
因爲搜索結果的好與壞是一個比較主觀的過程,因此進行定量的評估並不容易。
常見的作法是經過事先選定一批查詢,經過人工評估或是預先設定標準值的方式,逐個評估每一個設定查詢搜索結果,最終獲得一個統計結果,做爲搜索算法的評估度量。
另外一類作法是直接經過線上的用戶點擊數據來統計評估搜索結果質量,或是經過A/B測試來比較兩種排序算法的點擊效果來衡量。
合理而有效的評估方法,是搜索算法能夠不斷改進和比較的前提。
 
查詢分析是另外一個對搜索結果影響很大的方面,主要任務是把用戶的查詢文本轉換成內部的結構化的搜索請求。
涉及的處理可能包括基本的分詞處理,專有名詞的識別和提取,或是查詢模式的識別,或是查詢分類的識別。
這些處理的準確性將能極大地改進搜索請求的方式,進一步影響搜索結果的相關性和質量。
 
 
開源方案
 
近年來在搜索公司內部搜索系統和技術的改進和發展的同時,一批開源的搜索系統和解決方案也逐漸發展和成熟起來。
固然開源系統在功能全面性、複雜性和規模上都不能與專業的搜索引擎系統相比,但對於中小企業的搜索應用來講應該已經能很好地知足需求,並且也成功應用到了一些大規模的產品系統中(好比Twitter的搜索就使用和改進了Lucene)。
 
如今比較常見的開源搜索解決方案有:
 
* Lucene
Lucene天然是如今最流行,使用度最高的搜索開源方案。它用Java開發,以索引和檢索庫的方式提供,能夠很容易地嵌入須要的應用中。
 
* Solr & SolrCloud
Solr是Lucene的子項目,同屬Apache軟件基金會項目;它是基於Lucene之上實的一個完整的搜索服務應用,提供了大量的搜索定製功能,能夠知足大部分的搜索產品需求。
SolrCloud是Solr爲了增強其分佈式服務能力而開發的功能,目前還在開發階段,將在Solr 4.0發佈。
 
* Zoie & Sensei (Linkedin)
Zoie是Linkedin公司在Lucene基礎上實現的準實時索引庫,經過加入額外的內存索引,來達到準實時索引的效果。
Sensei是Linkedin公司在Zoie基礎上實現的分佈式搜索服務,經過索引分區來實現分佈式搜索服務。
 
* ElasticSearch
ElasticSearch 也是剛推出不久的一個基於Lucene實現的分佈式搜索服務,聽說在分佈式支持和易用性上都有不錯的表現。由於還比較年輕,真實的應用應該還很少,須要觀 察。由於也是基於Lucene的分佈式開源搜索框架,基本上會與SolrCloud和Sensei造成正面競爭關係。
 
* 其它開源產品
除了Lucene家族之外,還有一些其它的開源產品,好比Sphinx和Xapian,也有很多的應用;但近年來的更新頻率和社區活躍度都不太能和Lucene系的產品相比。
 
* 託管平臺
除 了開源產品外,如今還出現了一些基於雲計算和雲服務的搜索服務,好比Amazon新近推了的CloudSearch,還有更早一些的 IndexTank(已被Linkedin收購)。這類服務無需本身佈置搜索系統,直接使用在線服務,按需付費,因此也將是開源產品的替代方案和競爭對 手。
 
附幾張上面提到的開源系統的概念模型和架構圖:
 
[附圖:Lucene概念模型]
搜索引擎技術介紹 - yinan - Yinan的博客
 
[附圖:Lucene工做流程]
搜索引擎技術介紹 - yinan - Yinan的博客
 
[附圖:Sensei系統架構]
搜索引擎技術介紹 - yinan - Yinan的博客
[附圖:SolrCloud系統架構]
搜索引擎技術介紹 - yinan - Yinan的博客
 
現狀與將來
 
傳統的搜索引擎通過了十幾年的發展,目前在技術和產品上都已走向逐漸穩定和成熟,通用搜索的市場也基本進入飽和,不像早些年一直呈現高增加率。
同時,在各個垂直領域,也出現了不少和產品結合的很好的垂直搜索產品,好比淘寶的購物搜索,大衆點評的美食搜索,去哪兒和酷訊的旅遊搜索等,也都在各自領域佔據了至關大的市場,成爲除了通用搜索引擎以外的重要的用戶入口。
在開源領域,各類開源產品和解決方案也逐漸發展成熟,通用搜索技術再也不爲大公司所專有,中小企業可以以較低的成本實現本身的搜索應用。
如今搜索引擎產品之間的競爭更多的在數據、應用方式和產品形態上,在系統架構和基本算法上區分並不大。
 
搜索引擎在將來發展上,一是搜索將不只僅以獨立產品的形式出現,更多的會做爲搜索功能整合到更多的產品和應用中。
在產品形態上,基於傳統的搜索引擎,會演化出像推薦引擎,知識引擎,決策引擎等形式的產品,更好地知足和服務用戶需求。
而搜索引擎所涉及和發展起來的各類技術,會更普遍地應用到各類基它產品上,好比天然語言處理,推薦和廣告,數據挖掘,等等。
 
總之,搜索引擎對互聯網技術和產品帶來的影響是巨大的,將來也仍將有很大的發展和應用空間。
相關文章
相關標籤/搜索