本文是我寫的一篇數據庫相關的作業Report,在這里貼出來
1. 概述
1.1. 問題提出
假如你擁有一個龐大的網站,內容又多,那么來訪者往往很難找到自己所需要的東東,這時候你就需要一個站內搜索來幫助來訪者更快的找到索要的資料了!
1.2. 解決的辦法
搭建自己的全文檢索系統。
1.2.1. 什么是全文檢索
全文檢索是一種將文件中所有文本與檢索項匹配的文字資料檢索方法。全文檢索系統是按照全文檢索理論建立起來的用於提供全文檢索服務的軟件系統。 目前最大的搜索引擎Google和Baidu使用的就是全文檢索技術。當然Google基於Google三寶(GFS、MapReduce、BigTable)構建了龐大的大數據處理平台。全文檢索是搜索引擎技術的一個重要部分。
1.2.2. 數據分類
- 結構化數據:指具有固定格式或有限長度的數據,如數據庫,元數據等。
- 非結構化數據:指沒有固定格式或不定長的數據,如郵件,word文檔等。
非結構化數據還有一種叫法:全文數據。 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,並新建測試數據表並添加測試數據 目標數據表結構如下:
索引配置和搜索服務配置:
命令行搜索測試: 搜索關鍵詞linux
命令行中文搜索測試 因為Win32命令行不支持UTF-8輸入,故以下通用的搜索指令無法直接測試中文,使用coreseek 對中文支持的iconv指令測試中文:
四)搭建php WEB全文檢索 首先開啟搜索服務:
界面設計: index.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~,這樣直接獲取整個互聯網內容的方式簡直爽爆了。 后來發現百度等是全文搜索引擎,而百度完成的功能除了爬取網頁,網頁內容信息的處理也是一項重大的技術,還有搜索時的自然語言處理,所以我這次打算只把全文搜索這一點看看。