線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:889
推到 Plurk!
推到 Facebook!

搜索技術縱橫

 
conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-17 21:41:29 IP:218.175.xxx.xxx 未訂閱
http://www.sunsou.net/zongheng.htm 搜索技術縱橫 一. 搜索引擎原理 搜索引擎並不真正搜索互聯網,它搜索的實際上是預先整理好的網頁索引資料庫。 真正意義上的搜索引擎,通常指的是收集了因特網上幾千萬到幾十億個網頁並對網頁中的每一個詞(即關鍵字)進行索引,建立索引資料庫的全文搜索引擎。當用戶查找某個關鍵字的時候,所有在頁面內容中包含了該關鍵字的網頁都將作?搜索結果被搜出來。在經過複雜的演算法進行排序後,這些結果將按照與搜索關鍵字的相關度高低,依次排列。 現在的搜索引擎已普遍使用超鏈分析技術,除了分析索引網頁本身的內容,還分析索引所有指向該網頁的鏈結的URL、AnchorText、甚至鏈結周圍的文字。所以,有時候,即使某個網頁A中並沒有某個詞比如“惡魔撒旦”,但如果有別的網頁B用鏈結“惡魔撒旦”指向這個網頁A,那?用戶搜索“惡魔撒旦”時也能找到網頁A。而且,如果有越多網頁(C、D、E、F……)用名?“惡魔撒旦”的鏈結指向這個網頁A,或者給出這個鏈結的源網頁(B、C、D、E、F……)越優秀,那?網頁A在用戶搜索“惡魔撒旦”時也會被認?更相關,排序也會越靠前。 搜索引擎的原理,可以看做三步:從互聯網上抓取網頁→建立索引資料庫→在索引資料庫中搜索排序.從互聯網上抓取網頁 利用能夠從互聯網上自動收集網頁的Spider系統程式,自動訪問互聯網,並沿著任何網頁中的所有URL爬到其他網頁,重復這過程,並把爬過的所有網頁收集回來。 建立索引資料庫 由分析索引系統程式對收集回來的網頁進行分析,提取相關網頁資訊(包括網頁所在URL、編碼類型、頁面內容包含的關鍵字、關鍵字位置、生成時間、大小、與其他網頁的鏈結關係等),根據一定的相關度演算法進行大量複雜計算,得到每一個網頁針對頁面內容中及超鏈中每一個關鍵字的相關度(或重要性),然後用這些相關資訊建立網頁索引資料庫。 在索引資料庫中搜索排序 當用戶輸入關鍵字搜索後,由搜索系統程式從網頁索引資料庫中找到符合該關鍵字的所有相關網頁。因?所有相關網頁針對該關鍵字的相關度早已算好,所以只需按照現成的相關度數值排序,相關度越高,排名越靠前。 搜索引擎的Spider一般要定期重新訪問所有網頁(各搜索引擎的周期不同,可能是幾天、幾周或幾月,也可能對不同重要性的網頁有不同的更新頻率),更新網頁索引資料庫,以反映出網頁內容的更新情況,增加新的網頁資訊,去除死鏈結,並根據網頁內容和鏈結關係的變化重新排序。這樣,網頁的具體內容和變化情況就會反映到用戶查詢的結果中。 互聯網雖然只有一個,但各搜索引擎的能力和偏好不同,所以抓取的網頁各不相同,排序演算法也各不相同。大型搜索引擎的資料庫儲存了互聯網上幾億至幾十億的網頁索引,資料量達到幾千G甚至幾萬G。但即使最大的搜索引擎建立超過二十億網頁的索引資料庫,也只能占到互聯網上普通網頁的不到30%,不同搜索引擎之間的網頁數據重疊率一般在70%以下。我們使用不同搜索引擎的重要原因,就是因?它們能分別搜索到不同的內容。而互聯網上有更大量的內容,是搜索引擎無法抓取索引的,也是我們無法用搜索引擎搜索到的。 你心裏應該有這個概念:搜索引擎只能搜到它網頁索引資料庫裏儲存的內容。你也應該有這個概念:如果搜索引擎的網頁索引資料庫裏應該有而你沒有搜出來,那是你的能力問題,學習搜索技巧可以大幅度提高你的搜索能力。 二.搜索引擎技術的技術核心(下) 1.對Google的分析 ?了便於理解,現在假設我們所真正需要的東西是:搜索結果的標題。網址和簡介等,這是一個簡潔而典型的需求。這樣,我們所要做的便是:去除Google搜索結果的台頭和註腳,包括一個Google的標誌、再次搜索的輸入框和搜索結果說明等,並且在剩餘的搜索結果各項條目中剝離原來的HTML格式標記,替換成我們想要的格式。 要做到這一點,我們必須仔細地分析Google搜索結果的HTML源碼,找到其中的規律。不難發現,在Google的搜索結果的正文總是包含在源碼的第一個 標記和倒數第二個 標記之間,並且倒數第二個 標記後緊跟table字元,而且這個組合“ 以下所有程式均依次接續在上文程式的“進一步處理”處。 result_string = strstr( result_string, " "); //取 result_string從第一個 開始後的字串,以去除Google台頭 position= strpos( result_string," table符號的位置 result_string= substr( result_string,0, position);//截取第一個 table符號之前的字串,以去除註腳 2.應用與實現 OK,現在我們已經得到有用的HTML源碼主幹了,剩下的問題是如何自主地顯示這些內容。我們再分析一下這些搜索結果條目,發現每個條目之間也是很有規律的用 分隔,也就是各成一個段落,按這個特點我們用explode()函數把每個條目切開: 語法:explode(string separator, string string); 返回一個陣列,按separator切開後的各個小字串被保存在陣列中。 於是: result_array=explode(" ", result_string); //用字串" "把結果切開我們就得到一個陣列 result_array,其中每個元素都是一個搜索結果條目。我們所要做的僅僅是研究每個條目及其HTML顯示格式代碼,然後按要求替換就行了。 下面用迴圈來處理 result_array中的每個條目。 for( i=0; ibr> {} 對於每個條目,我們也很容易找到一些特點:每個條目都由標題、摘要、簡介、類別、網址等組成,每個部分都換行,即包含 標記,於是再次分割:(以下處理程式放在上文的迴圈中) every_item=explode(" ", result_array[ i]); 這樣我們得到一個陣列 every_item,其中 every_item[0]就是標題,every_item[1]和 every_item[2]兩行?摘要, every_item[3]和 every_item[4]等等的頭部如果包含“簡介:”、“類別:”字元,則是簡介或類別(因?有的結果條目沒有該項),如果頭部包含“”則肯定就是網址啦,這種對比判斷我們常使用正則運算式(略),如果要替換也很方便. 比如包含標題的$every_item[0],其本身是有鏈結的,我們希望修改這個鏈結屬性,讓它在新視窗打開鏈結: echo eregi_replace('br> { ... //處理每個條目中除去第一項(第一項?標題,已經顯示)的每一項 ... //更多格式修改 } 這樣就修改了鏈結屬性,其餘很多顯示格式的修改、剝離、替換都能用正則替換eregi_replace()來完成。 至此我們已經得到了每個搜索條目的每一項,並能任意修改每項的格式,甚至可以給他套上漂亮的表格。然而一個好的程式應該能適應各種運行環境的,這裏也不例外,我們其實還只是討論了搜索結果的HTML剝離的一種框架方法,真正要做得完美,還要考慮很多內容,比如要顯示一共搜索出多少結果,分成多少頁等等,甚至還可以刨除與Google相關的那些“類別”、“簡介”等代碼,讓客戶根本看不到原始網站。不過這些內容和要求我們都能通過分析HTML進行剝離得到。現在大家完全能自己動手,做個極富個性化的搜索引擎啦。
系統時間:2024-09-09 16:40:13
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!