標籤:style blog http color 使用 os io 檔案
本文是我寫的一篇資料庫相關的作業Report,在這裡貼出來
1. 概述
1.1. 問題提出
假如你擁有一個龐大的網站,內容又多,那麼來訪者往往很難找到自己所需要的東東,這時候你就需要一個站內搜尋來協助來訪者更快的找到索要的資料了!
1.2. 解決的辦法
搭建自己的全文檢索索引系統。
1.2.1. 什麼是全文檢索索引
全文檢索索引是一種將檔案中所有文本與檢索項匹配的文字資料檢索方法。全文檢索索引系統是按照全文檢索索引理論建立起來的用於提供全文檢索索引服務的軟體系統。
目前最大的搜尋引擎Google和Baidu使用的就是全文檢索索引技術。當然Google基於Google三寶(GFS、MapReduce、BigTable)構建了龐大的大資料處理平台。全文檢索索引是搜尋引擎技術的一個重要部分。
1.2.2. 資料分類
非結構化資料還有一種叫法:全文資料。
1.2.3. 按資料的分類,搜尋也分為兩種
如對資料庫的搜尋:SQL語句。再如windows的搜尋:檔案名稱,類型,修改時間。
如windows對檔案內容的搜尋。Linux下得grep命令。再如Google和百度可以搜素大量內容資料。
對於非結構化的資料搜尋也叫做對全文資料的搜尋。要獲得良好的搜尋體驗,全文檢索索引技術可以達到這一點。對全文資料的搜尋還可以分為兩種:
順序掃描:如要找內容包含某個字串的檔案,會一個文檔一個文檔的從頭到尾的找,如 Like尋找 。
索引掃描:把非結構化的資料中的內容提取出來一部分重新組織,讓它變的有結構化,這部分我們提取出來的資料就叫做索引.
單純的使用資料庫提供的全文檢索搜尋已經不能滿足網站對於搜尋功能的要求,目前大資料時代想要從海量資料中擷取必要資料,建立強大的全文檢索索引系統十分必要。
2. 全文檢索索引系統設計與實現策略
2.1. 系統的架構
這裡用一張圖說明:
2.2. 模組設計
全文檢索索引大體分兩個過程:
索引建立(Indexer)和 搜尋索引(Search)。
搜尋索引:就是得到使用者的查詢請求,搜尋建立的索引,然後返回結果的過程。
2.2.1. 資訊處理
資訊處理模組的核心就是索引的建立。
索引裡面究竟存些什嗎?(Index)
索引所儲存的資訊一般如下:
假設我現在有100篇文檔,從1到100表示。
詞典:儲存的是一系列的字串。
倒排表: 指向包含字串的文檔鏈表。
如何建立索引?
全文檢索索引的索引建立過程一般有以下幾步:
一些需要建立索引的文檔(Documents)。
將原文檔傳給分片語件(Tokenizer) 。
將得到的詞元(Token)傳給語言處理組件(Linguistic Processor)。
將得到的詞(Term)傳給索引組件(Indexer)。
合并相同的詞(Term)成為文檔倒排(Posting List)鏈表
(索引結構圖示)
Document Frequenc :即文檔頻次,表示總共有多少檔案包含此詞(Term)
Frequency :即詞頻率,表示此檔案中包含了幾個此詞(Term)
補充:建立索引是系統的核心任務,需對主題詞典處理、資訊消重、文檔建模、文件剖析和過濾以及建立倒排索引。還需要要處理停詞(如一些意義不大的虛詞)。
2.2.2. 查詢服務
查詢服務的重點是搜尋索引。
如何對索引進行搜尋
搜尋主要分為以下幾步:
查看Google搜尋:
2.3. 系統整體運作流程
2.3.1. 索引過程:
有一系列被索引檔案
被索引檔案經過文法分析和語言處理形成一系列詞(Term)。
經過索引建立形成詞典和反向索引表。
通過索引儲存將索引寫入硬碟。
2.3.2. 搜尋過程:
a) 使用者輸入查詢語句。
b) 對查詢語句經過文法分析和語言分析得到一系列詞(Term)。
c) 通過文法分析得到一個查詢樹。
d) 通過索引儲存將索引讀入到記憶體。
e) 利用查詢樹搜尋索引,從而得到每個詞(Term)的文檔鏈表,對文檔鏈表進行交,差,並得到結果文檔。
f) 將搜尋到的結果文檔對查詢的相關性進行排序。
g) 返回查詢結果給使用者。
3. 實驗/系統執行(Experiment)
3.1. 實驗的目標
實驗的搜尋引擎能夠正常運行,索引和檢索兩個階段的工作。通過本次實驗,將驗證筆者設計設計思路的可行性。
基於開源的搜尋引擎coreseek來搭建本次實驗系統。Coreseek是基於Sphinx的中文全文檢索索引系統,良好的支援了中文分詞。但是基本原理是配置方法和Sphinx類似。
Sphinx是一個基於SQL的全文檢索索引引擎,可以結合MySQL,PostgreSQL做全文檢索搜尋,它可以提供比資料庫本身更專業的搜尋功能,使得應用程式更容易實現專業化的全文檢索索引。
(圖片來自開源中國)
3.2. 實驗步驟
1)準備工作
官方網站下載coreseek: http://www.coreseek.cn
搭建php+mysql環境;
2)建立資料來源
建立mysql資料庫,資料庫名:fulltext,並建立測試資料表並添加測試資料
目標資料表結構如下:
3)安裝測試coreseek
配置資料來源:
索引配置和搜尋服務配置:
測試組態和建立索引:
命令列搜尋測試:
搜尋關鍵詞linux
命令列中文搜尋測試
因為Win32命令列不支援UTF-8輸入,故以下通用的搜尋指令無法直接測試中文,使用coreseek 對中文支援的iconv指令測試中文:
四)搭建php WEB全文檢索索引
首先開啟搜尋服務:
介面設計:
index.php
搜尋處理常式:search.php
SetServer ( ‘127.0.0.1‘, 9312); $cl->SetConnectTimeout ( 3 ); $cl->SetArrayResult ( true ); $cl->SetMatchMode ( SPH_MATCH_ANY); $res = $cl->Query ( $keyword, "*" ); $info = array(); if ($res != null) { $info[‘id‘] = $res [‘id‘]; $info[‘total‘] = $res [‘total‘]; $info[‘time‘] = $res [‘time‘]; $idarr = array(); foreach ( $res [‘matches‘] as $doc ) { $idarr[] = $doc[‘id‘]; } //從mysql中檢索結果id $ids = join ( ‘,‘, $idarr ); mysql_connect ( "localhost", "root", "" ); mysql_select_db ( "fulltext" ); $sql = "select * from documents where id in({$ids})"; mysql_query ( "set names utf8" ); $resdb = mysql_query ($sql); //設定高亮屬性 $opts = array( ‘before_match‘=>"", ‘after_match‘=>"" ); $htmlres = array(); while ($row = mysql_fetch_assoc($resdb)) { $res2 = $cl->BuildExcerpts($row, "mysql",$keyword, $opts); $id = $res2[0]; echo $title = $res2[1]; echo $content = $res2[2]; $htmlres[] = array(‘id‘=>$id,‘title‘=>$title,‘content‘=>$content); } } $_SESSION[‘info‘] = $info; $_SESSION[‘htmlres‘] = $htmlres; header("Location: index.php"); ?>
輸入linux關鍵詞檢索執行個體:
完全支援中文:
4. 總結
本次實驗驗證了獨立搭建網站的全文檢索索引系統的可行性。
之前考慮打算做個類似百度的可以耙梳頁並完成索引處理提供搜尋的小型搜尋引擎,但當開始進行系統架構設計的時候發現,一個完整的搜尋引擎完成的任務太多,以前學php的時候覺得get_file_content()這種函數很好玩,寫個簡單的指令碼程式可以從百度貼吧裡面下載可愛妹子圖片O(∩_∩)O~,這樣直接擷取整個互連網內容的方式簡直爽爆了。
後來發現百度等是全文檢索搜尋引擎,而百度完成的功能除了爬取網頁,網頁內容資訊的處理也是一項重大的技術,還有搜尋時的自然語言處理,所以我這次打算只把全文檢索搜尋這一點看看。