天天看點

我的私享搜尋引擎

    搜尋真是個好東西,沒有前想找點東西忒費勁,也不知道去哪找,現在趕上好時候了,敲敲鍵盤點點滑鼠問問度娘啥都知道了。雖然好些人吐槽度娘太任性,可有時候沒她真不行,搜尋結果和谷歌差不是一星半點兒,尤其技術貼,真懷念當年

www.g.cn

,但有的選嗎,既然不能改變隻能含着淚往前走。

    開源的資源最牛逼的要說是lucene了,特别這些年不斷完善,太多公司的産品用它了。另外一個是ELK,其實底層也是依托lucene做索引的核心層,從資料采集、建立索引到檢索服務一條龍解決方案,支撐企業級應用綽綽有餘,更大的資料規模也不在話下,分布式特性完美的順應了時代需要(不雲不開森),連噴子們都着急幹跺腳找不到槽點完全生無可戀。

    哥不信那套,非要擠擠這個粉刺,who說沒槽點,有呀,ELK每次更新都面目全非,一點傳承性都沒有,完全颠覆碼畜們的認知,太虐心了,本來學點東西就吃力,悟性差智商低歲數大野路子半路出家,不利因素集于一身,ELK這是借更新清理門戶嗎?其實ELK确實很不錯,非常值得研究和學習,等有時間了一定大書特書一番。開春兒了,壓箱底兒的存貨發黴了,拿出來曬曬太陽曝曝光,聊聊自己的私有搜尋引擎吧。

    漢語分詞,老祖宗流傳下來的語言太美妙了,發音悅耳書寫優美唯一的缺點就是疏忽了單詞間距,西洋語言發音蹩腳輔音結尾聲調不分全特麼是缺點,但就一點好單詞間空格分隔分詞太省力了。吐血推薦漢語分詞利器ANSJ,精度要求不高的話拿去用妥妥的,JAVA語言ToAnalysis.parse(sentence).recognition(filter)一句話搞定,管你啥字元集呢,還能自定義使用者字典,自定義停用詞庫、屬性過濾等等,真是小微企業的福音呀,感謝開源。Java分詞用例可以參考,http://git.oschina.net/gonglibin/codes/rnplksfcy07ezivm3q4th53,另一個是基于字典庫自己實作的C分詞,http://git.oschina.net/gonglibin/codes/2570vrhlbutonmjxqc1az97。

     停用詞表,漢語詞彙可分為兩個大類,實詞和虛詞,以及十五個小類。其中,名詞、動詞、形容詞、數詞、量詞、代詞、副詞、差別詞、狀态詞共九小類為實詞;介詞、連詞、助詞、語氣詞等四小類為虛詞。加之兩類特殊的詞,拟聲詞和歎詞,共同組成漢語詞彙類型。就分析系統本身而言,實詞中的數詞、量詞、代詞、差別詞、狀态詞,以及虛詞四小類、特殊詞類的拟聲詞和歎詞均收錄在停用詞表中。看看吧,為啥說漢語精彩呀,光詞性分類就相當瘋狂了,當然具體表定義還要具體分析,看行業看業務看需求,應該是各有各的不同。

    正排索引,正向索引是在完成分詞後,對詞組進行特征标注的過程,包括展現頻率、出現位置、詞組格式等屬性。正向索引在記憶體中以鍵值對方式暫存,将文檔ID作為主鍵,詞組集合作為值,在導入至反向索引後删除。可以選擇的容器很多,不考慮效率哪種都中。

我的私享搜尋引擎

    反向索引,反向索引以字或詞組為關鍵字建立索引,關鍵字對應的記錄項儲存了出現這個字或詞組的文檔集合,記錄着該文檔的ID和各個字元在該文檔中出現的位置資訊及描述。由于每個字或詞組對應的文檔數量是動态變化的,是以倒排表的建立和維護較為複雜,哥覺得複雜不代表别人也覺得複雜噢。由于查詢的時候可以一次性得到查詢關鍵字所對應的全部文檔ID的集合,是以計算效率較高。在檢索過程中,響應速度是一個較為關鍵的性能名額,而索引的建立是在背景進行,雖然效率相對差一些,但并不會影響到整個搜尋引擎的總體效率。

我的私享搜尋引擎

    索引建立,資料應用是對結果資料進行一系列的預處理,按照定義的格式生成索引資料儲存起來,等待搜尋引擎加載子產品的初始化操作,假設索引資料包括使用者興趣、使用者地域、使用者類型等次元。資料加載子產品讀取存儲器中的中間資料并寫入到記憶體資料庫中,一個或多個搜尋引擎的執行個體将記憶體映射到本程序中,保證資料樣本一緻性和并發通路。

我的私享搜尋引擎

    搜尋引擎通過解析URL的入口參數,對檢索集進行整合排序操作後,傳回給調用使用者。使用者根據不同的業務類型向資料引擎發起資源定位請求,進而擷取搜尋結果。一次完整的檢索請求由兩個步驟組成,索引查詢和資料傳輸。第一步将關鍵字對應的DOC資料的ID集合傳回,應用層再對ID集合周遊,逐一擷取對應的DOC快照片段或全量文本。

我的私享搜尋引擎

     1、解析URL參數,擷取索引項、關鍵字、邏輯關系及結果區間;

     2、根據各個關鍵字擷取文檔ID集合,僅留存符合的索引字段項;

    3、根據索引字段項邏輯關系歸并多個關鍵字對應的文檔ID集合;

    4、根據關鍵字展現頻率、出現位置、詞組格式等屬性來計算權重;

    5、根據權重值按照降序執行排序,按使用者請求集合結果區間傳回;

    檢索流程是一個高度實時性同步通信服務系統,使用者搜尋操作的請求與應答需要控制在毫秒級時間段内,在搜尋特性上同時具備BFS(廣度優先)與DFS(深度優先)的特性,并且通過tf-idf向量模型來評估一個字或一個詞組在語料中的重要程度。

我的私享搜尋引擎

    擺糊了這麼多說說咋存的吧,正排用單鍊放記憶體裡,管他呢記憶體有的是不用白不用,倒排放codis裡分布式全權托管,定義好資料結構想怎麼用怎麼用,持久化啦讀寫異常啦記憶體管理啦基本不用過問,連接配接池裡取出一個用,想着還就行了,搜尋優化略微費點心,無論如何省不掉的,工作量的大頭,水很深,拼技術拼體力看顔值看人品的活兒。DOC集合扔mongodb裡,半結構化加分布式個人覺得穩定性效率并發各方面還是挺合适的。最後補充說明下,搜尋技術是一個非常龐大的全面性系統性的複雜工程,值得學習的地方非常多,對個人技能的提升很有幫助,今天這篇low文就算是一個好的開始吧。

    北京去年冬天不太冷,今年春天來的又早,柳絮沒往年多,高速出京一如既往的堵,天真藍雲真白難得好天氣,吉野家的什錦蘑菇飯濃重的葷油味冒充假素食,教育訓練班的孩子們匆匆忙忙扒拉幾口飯又趕下一場去了,不容易可也沒辦法,苦點累點總比被淘汰好,除了那些高尚的、純粹的、脫離了低級趣味的人們。兩年一屆的上海車展即将拉開帷幕,勞斯萊斯法拉利蘭博基尼早早被預定光了,今年下手又晚了,午飯雞蛋灌餅裡一定多加兩片生菜,安慰一下那顆受傷的心。

繼續閱讀