最近在做一個關於搜尋引擎方面的項目,於是乎研究了一點關於搜尋引擎方面的東西。我們的目標是做一個輕量級的搜尋引擎,相對真正的商業搜尋引擎來說還是較為簡單的。
對於搜尋引擎這樣的項目來說,我覺得重點在於品質要求,對於功能要求可能會弱一點。高並發,高儲存量和快速查詢是一個搜尋引擎的命脈,而在功能上重點要注意的是幾個演算法的實現。以前做的項目大多數只是注重功能的實現,對於效能的要求很低,而這次的項目則要求我們對這方面有所注重,也是一次很好的學習過程。
從該項目的需求出發,將項目分為4個模組,分別為抓模數塊,分析模組,搜尋模組和使用者介面模組。對於每個模組的需求進行的相應的劃分。根據需求以及現實的硬體條件,初步設計出搜尋引擎的體繫結構,如。
抓模數塊和分析模組
首先是抓模數塊和分析模組,對於互連網進行週期性網頁爬取,並進行分析。將爬取和分析的資料存放區到資料庫。對於資料庫,主要分為4個部分,儲存連結結構的連結資料表,儲存網頁內容的內容表,建立關鍵詞倒排索引的索引表和用於競價排名的競價表。
在爬取和分析資料的時候需要在連結資料表中預儲存一部分網頁連結,根據已有的網頁連結進行網頁爬取,並且將新的連結儲存的資料庫中,採用類似隊列的方式對於網頁爬取連結進行處理。對於連結資料表中資料的設計要考慮到後期根據反向連結的數量進行搜尋結果排序。將爬取和分析後的頁面儲存到內容表中,並且,分析模組分析網頁建立詞項的倒排索引儲存到索引表中。
在品質要求方面要求對資料庫中的資料進行加密處理以及多個伺服器之間的資料同步。我們的設計是多個伺服器上的資料庫進行完全冗餘儲存,及多個資料庫中的資料同步。每個伺服器進行網頁的爬取和分析以後要將本伺服器新增的資料發送給另外的伺服器以保持資料同步。
搜尋模組
搜尋模組的主要功能是根據使用者的請求進行處理,返回給使用者搜尋的結果。因為多個伺服器之前的資料庫是冗餘的,所以在搜尋的時候只要對本伺服器進行搜尋即可。
搜尋模組接受到使用者的請求,將使用者的請求進行分詞處理和近義詞處理。然後通過對索引表和內容表的查詢,搜尋出結果集,並且根據連結資料表和競價表對結果集進行加權和排序。將排序後的結果集返回給使用者。
在品質要求方面要求大量使用者的並發執行,要求多線程和良好的Bean容器。
使用者介面模組
使用者介面模組運行在另外的一個web伺服器上,該web伺服器呈現網頁並接受使用者的請求,首先對使用者的輸入進行敏感詞分析,將分析過的請求發送到後台伺服器,並從後台伺服器獲得搜尋結果,將結果顯示給使用者。
品質上要求多使用者的並發,主要體現在要求良好web容器和多線程,以及在發送請求到後台伺服器時的負載平衡。