打造自己的非Lucene分佈式搜索引擎底層架構

打造自己的分佈式搜索引擎底層架構(非Lucene)

大家知道,搜索引擎技術不僅僅是類似百度首頁的應用,還可以衍生出數據分析工具,商務智能工具等許多有賣點的應用,甚至是社會化關係通道的發現。
甚至這些非搜索引擎的搜索引擎產品纔是最重要的,因爲你不需要去做百度做的事情。
所以,搜索引擎技術要了解原理,纔可以擴展,離開Lucene也能做搜索引擎是非常重要的,利用這個積木,我們可以搭建房子和汽車。


搜索引擎要完成的目的,就是O(1)秒殺爬蟲採集來的文章裏關鍵字的搜索,丫的和數據庫Like不同的效果優點是速度快,缺點是如果沒建索引的字,搜不到。

本文是針對:打造一個自己的搜索引擎服務器的積木底層模塊,給大家擴展思路和分析知識,同時爲我下一步的工作打下基礎。
但是這個基本思路我要保證是靠譜的,並且可以達到給大家分享數據結構知識的目的。

 
做自己的搜索引擎(非Lucene),需要兩大幾方面的知識:

一,簡單夠用的分佈式;

二,基本的數據結構和算法,知道複雜度和數據結構的對應關係。

重點是二

所以本文會花時間講解如何利用.Net自帶的集合幹這個事兒。

 

先快速把一部分帶過:

1,文件+數據庫服務器羣,首先你要有大量的文章,爬蟲採集來的或者你用啥辦法搞來的,這些按T計算的文章一個機器放不下,也沒必要放一起,因爲硬盤併發性能比較差,你需要有一堆機器是存放這些文件的,處理文件的事兒,交給這些機器併發去處理,而不應該是

一個機器排隊處理,如果用.NET來做WCF架構比較合適,WCF自己去搜索,本文不細談。

2,Web服務器羣,數據庫要應付大量搜索請求,搜索引擎纔有意義,所以Web負載均衡和反向代理是必要的,自己去搜反向代理,Nginx,Squid之類的詞,本文不講。

3,MemChached羣,是分佈式的哈希表,一個機器放不下我們期望的內存數量,自己去搜MemChached,本文不講。

4,索引服務器羣,就是定時或者一直在忙活簡歷索引的後臺服務器,單獨搞幾臺。

總之你需要4羣服務器,每個羣的數量看需要和你的錢數調整,沒錢就都搞一個機器上,如果只是實驗的話。

下面是本文的關鍵部分。
先說數據結構的原理:(數據結構和算法要解決的基本問題就是搜索和排序)

1,搜索:查找一個東西有還是沒有,複雜度是O(1),哈希表,搜索引擎就是利用哈希表的這個特性,其他O(n)或O(logN)的搜索不適合幹這個。
2,排序:如果大家都有,那麼哪個文章詞出現的頻率就是決定顯示的排序,排序,職業的做法是O(N*logN)時間空間都OK,如果你說只學過冒泡,那你拿鼠標拍自己的頭吧,趕緊找本書看看爲啥冒泡O(n^2)是業餘的。
3,動態排序的概念是對於新插入的元素能以O(LogN)的複雜度到達自己應該站的位置,一般做法是二叉堆,在.Net裏是SortedList<T,T>泛型容器,至於裏邊實現,不管他,反正滿足我們需要的複雜度。

好,以上三個概念是我們解決一切問題的出發點,複雜度和數據結構的對應關係一定要形成大腦的條件反射,不需要你非要數據結構考試85分,但是這種意識是優秀程序員必備的。

分析搜索的過程:
0,高頻字典:我們提前準備個高頻字典,是哈希字典容器Dict<WordID(int),Word(string)>;這個可以放在集羣MemCached裏,也可以按照你的機器數量分段存放。

1,輸入檢驗:用戶輸入一個詞,先檢驗這個詞在詞典裏要有編號,沒編號的加進去,當然新放的不可能被搜到,建立索引後下次才能被搜到;

2, 哈希搜索:要達到O(1),我們必須知道這個詞對應哪些文章。需要這樣一個哈希字典容器Dict<WordID(int),SortedList<DocID(int),Freq(int)>>;這樣能返回一堆排序好的文章。我們先假設按照詞的頻率去排序。

3,初始化分詞:爲了實現SortedList<T,T>,我們在第一次初始化分詞,就是把文章裏出現的二字,三字,四字長的等詞彙,找出來,按照出現的頻率進行排序,這個以文章爲索引的也要建立。Dict<DocID(int),SortedList<WordID(int),Freq(int)>>
 http://topic.csdn.net/u/20070914/17/9A27E63A-CAD6-4955-8E14-61DC9357A8AD.html這裏有我以前寫的例子,本文不細說了。

4,分詞作業:爲了保證用戶輸入的都被索引,分詞要形成作業,就是有個後臺程序不斷的維護這個搜索引擎的分詞索引,還要及時把索引序列化到文件裏,保存起來,以便下次開機後不需要再計算。

5,新加的文章需要進行3的步驟,新加的用戶詞彙,比如“給力”需要進行4的步驟。

其他輔助步驟
1,爬蟲採集數據,文章的粒度,新聞要大文本存放,不論是數據庫的Text字段還是純文本,都要把HTML標籤分解開來,如果對於微博,要分解到用戶ID,文章ID,轉發ID,粉絲ID等可以被計算的數值。
2,語義分析,如評論的正面還是負面,需要分揀數據,人工賦予智能。
3,文章重複或者相關性檢測,利用關鍵字分佈的頻率,餘弦算法(自己去搜索)來計算相似度。
 
 
先寫到這裏,後續想到的,再補充,中間被一串會議打斷了思路。

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章