打造自己的分布式搜索引擎底层架构(非Lucene)
打造自己的分布式搜索引擎底層架構(gòu)(非Lucene)
大家知道,搜索引擎技術(shù)不僅僅是類(lèi)似百度首頁(yè)的應(yīng)用,還可以衍生出數(shù)據(jù)分析工具,商務(wù)智能工具等許多有賣(mài)點(diǎn)的應(yīng)用,甚至是社會(huì)化關(guān)系通道的發(fā)現(xiàn)。
甚至這些非搜索引擎的搜索引擎產(chǎn)品才是最重要的,因?yàn)槟悴恍枰プ霭俣茸龅氖虑椤?br />所以,搜索引擎技術(shù)要了解原理,才可以擴(kuò)展,離開(kāi)Lucene也能做搜索引擎是非常重要的,利用這個(gè)積木,我們可以搭建房子和汽車(chē)。
搜索引擎要完成的目的,就是O(1)秒殺爬蟲(chóng)采集來(lái)的文章里關(guān)鍵字的搜索,丫的和數(shù)據(jù)庫(kù)Like不同的效果優(yōu)點(diǎn)是速度快,缺點(diǎn)是如果沒(méi)建索引的字,搜不到。
本文是針對(duì):打造一個(gè)自己的搜索引擎服務(wù)器的積木底層模塊,給大家擴(kuò)展思路和分析知識(shí),同時(shí)為我下一步的工作打下基礎(chǔ)。
但是這個(gè)基本思路我要保證是靠譜的,并且可以達(dá)到給大家分享數(shù)據(jù)結(jié)構(gòu)知識(shí)的目的。
?
做自己的搜索引擎(非Lucene),需要兩大幾方面的知識(shí):
一,簡(jiǎn)單夠用的分布式;
二,基本的數(shù)據(jù)結(jié)構(gòu)和算法,知道復(fù)雜度和數(shù)據(jù)結(jié)構(gòu)的對(duì)應(yīng)關(guān)系。
重點(diǎn)是二
所以本文會(huì)花時(shí)間講解如何利用.Net自帶的集合干這個(gè)事兒。
先快速把一部分帶過(guò):
1,文件+數(shù)據(jù)庫(kù)服務(wù)器群,首先你要有大量的文章,爬蟲(chóng)采集來(lái)的或者你用啥辦法搞來(lái)的,這些按T計(jì)算的文章一個(gè)機(jī)器放不下,也沒(méi)必要放一起,因?yàn)橛脖P(pán)并發(fā)性能比較差,你需要有一堆機(jī)器是存放這些文件的,處理文件的事兒,交給這些機(jī)器并發(fā)去處理,而不應(yīng)該是
一個(gè)機(jī)器排隊(duì)處理,如果用.NET來(lái)做WCF架構(gòu)比較合適,WCF自己去搜索,本文不細(xì)談。
2,Web服務(wù)器群,數(shù)據(jù)庫(kù)要應(yīng)付大量搜索請(qǐng)求,搜索引擎才有意義,所以Web負(fù)載均衡和反向代理是必要的,自己去搜反向代理,Nginx,Squid之類(lèi)的詞,本文不講。
3,MemChached群,是分布式的哈希表,一個(gè)機(jī)器放不下我們期望的內(nèi)存數(shù)量,自己去搜MemChached,本文不講。
4,索引服務(wù)器群,就是定時(shí)或者一直在忙活簡(jiǎn)歷索引的后臺(tái)服務(wù)器,單獨(dú)搞幾臺(tái)。
總之你需要4群服務(wù)器,每個(gè)群的數(shù)量看需要和你的錢(qián)數(shù)調(diào)整,沒(méi)錢(qián)就都搞一個(gè)機(jī)器上,如果只是實(shí)驗(yàn)的話(huà)。
下面是本文的關(guān)鍵部分。
先說(shuō)數(shù)據(jù)結(jié)構(gòu)的原理:(數(shù)據(jù)結(jié)構(gòu)和算法要解決的基本問(wèn)題就是搜索和排序)
1,搜索:查找一個(gè)東西有還是沒(méi)有,復(fù)雜度是O(1),哈希表,搜索引擎就是利用哈希表的這個(gè)特性,其他O(n)或O(logN)的搜索不適合干這個(gè)。
2,排序:如果大家都有,那么哪個(gè)文章詞出現(xiàn)的頻率就是決定顯示的排序,排序,職業(yè)的做法是O(N*logN)時(shí)間空間都OK,如果你說(shuō)只學(xué)過(guò)冒泡,那你拿鼠標(biāo)拍自己的頭吧,趕緊找本書(shū)看看為啥冒泡O(n^2)是業(yè)余的。
3,動(dòng)態(tài)排序的概念是對(duì)于新插入的元素能以O(shè)(LogN)的復(fù)雜度到達(dá)自己應(yīng)該站的位置,一般做法是二叉堆,在.Net里是SortedList<T,T>泛型容器,至于里邊實(shí)現(xiàn),不管他,反正滿(mǎn)足我們需要的復(fù)雜度。
好,以上三個(gè)概念是我們解決一切問(wèn)題的出發(fā)點(diǎn),復(fù)雜度和數(shù)據(jù)結(jié)構(gòu)的對(duì)應(yīng)關(guān)系一定要形成大腦的條件反射,不需要你非要數(shù)據(jù)結(jié)構(gòu)考試85分,但是這種意識(shí)是優(yōu)秀程序員必備的。
分析搜索的過(guò)程:
0,高頻字典:我們提前準(zhǔn)備個(gè)高頻字典,是哈希字典容器Dict<WordID(int),Word(string)>;這個(gè)可以放在集群MemCached里,也可以按照你的機(jī)器數(shù)量分段存放。
1,輸入檢驗(yàn):用戶(hù)輸入一個(gè)詞,先檢驗(yàn)這個(gè)詞在詞典里要有編號(hào),沒(méi)編號(hào)的加進(jìn)去,當(dāng)然新放的不可能被搜到,建立索引后下次才能被搜到;
2, 哈希搜索:要達(dá)到O(1),我們必須知道這個(gè)詞對(duì)應(yīng)哪些文章。需要這樣一個(gè)哈希字典容器Dict<WordID(int),SortedList<DocID(int),Freq(int)>>;這樣能返回一堆排序好的文章。我們先假設(shè)按照詞的頻率去排序。
3,初始化分詞:為了實(shí)現(xiàn)SortedList<T,T>,我們?cè)诘谝淮纬跏蓟衷~,就是把文章里出現(xiàn)的二字,三字,四字長(zhǎng)的等詞匯,找出來(lái),按照出現(xiàn)的頻率進(jìn)行排序,這個(gè)以文章為索引的也要建立。Dict<DocID(int),SortedList<WordID(int),Freq(int)>>
?http://topic.csdn.net/u/20070914/17/9A27E63A-CAD6-4955-8E14-61DC9357A8AD.html這里有我以前寫(xiě)的例子,本文不細(xì)說(shuō)了。
4,分詞作業(yè):為了保證用戶(hù)輸入的都被索引,分詞要形成作業(yè),就是有個(gè)后臺(tái)程序不斷的維護(hù)這個(gè)搜索引擎的分詞索引,還要及時(shí)把索引序列化到文件里,保存起來(lái),以便下次開(kāi)機(jī)后不需要再計(jì)算。
5,新加的文章需要進(jìn)行3的步驟,新加的用戶(hù)詞匯,比如“給力”需要進(jìn)行4的步驟。
其他輔助步驟
1,爬蟲(chóng)采集數(shù)據(jù),文章的粒度,新聞要大文本存放,不論是數(shù)據(jù)庫(kù)的Text字段還是純文本,都要把HTML標(biāo)簽分解開(kāi)來(lái),如果對(duì)于微博,要分解到用戶(hù)ID,文章ID,轉(zhuǎn)發(fā)ID,粉絲ID等可以被計(jì)算的數(shù)值。
2,語(yǔ)義分析,如評(píng)論的正面還是負(fù)面,需要分揀數(shù)據(jù),人工賦予智能。
3,文章重復(fù)或者相關(guān)性檢測(cè),利用關(guān)鍵字分布的頻率,余弦算法(自己去搜索)來(lái)計(jì)算相似度。
?
?
先寫(xiě)到這里,后續(xù)想到的,再補(bǔ)充,中間被一串會(huì)議打斷了思路。
?
本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/superdullwolf/archive/2011/01/26/6165342.aspx
轉(zhuǎn)載于:https://www.cnblogs.com/dullwolf/archive/2011/01/27/1945908.html
總結(jié)
以上是生活随笔為你收集整理的打造自己的分布式搜索引擎底层架构(非Lucene)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: STM32示波器 信号发生器
- 下一篇: FlashPaper安装及使用方法