1、Sphinx(coreseek) 是啥
一般而言,Sphinx是一個獨立的全文搜索引擎;而Coreseek是一個支持中文的全文搜索引擎,意圖為其他應用提供高速、低空間占用、高結果相關度的中文全文搜索能力。Sphinx/Coreseek可以非常容易的與SQL數據庫和腳本語言集成。
也就是說Coreseek可以單獨使用,不需要再安裝Sphinx
2、從哪里獲取
Sphinx原始版本可以從Sphinx官方網站 http://www.sphinxsearch.com/,Coreseek可以從Coreseek官方網站 http://www.coreseek.cn/下載.
3、主要特性
目前,Sphinx/Coreseek的發布包包括如下軟件:
indexer
: 用於創建全文索引;search
: 一個簡單的命令行(CLI) 的測試程序,用於測試全文索引;searchd
: 一個守護進程,其他軟件可以通過這個守護進程進行全文檢索;sphinxapi
: 一系列searchd 的客戶端API 庫,用於流行的Web腳本開發語言(PHP, Python, Perl, Ruby, Java).spelldump
: 一個簡單的命令行工具,用於從ispell
或MySpell
(OpenOffice內置綁定) 格式的字典中提取詞條。當使用 wordforms 時可用這些詞條對索引進行定制.indextool
: 工具程序,用來轉儲關於索引的多項調試信息。 此工具是從版本Coreseek 3.1(Sphinx 0.9.9-rc2)開始加入的。mmseg
: 工具程序和庫,Coreseek用於提供中文分詞和詞典處理。
4、安裝Coreseek
1)將你下載的tar包解壓,並進入coreseek
子目錄:
$ tar xzvf coreseek-3.2.14.tar.gz $ cd coreseek
2)首先安裝MMSeg:
$ cd mmseg $ ./configure --prefix=/usr/local/mmseg $ make $ make install $ cd ..
3)運行配置程序:
$ ./configure
configure程序有很多運行選項。完整的列表可以通過使用 --help
開關得到。最重要的如下:
--prefix
, 定義將Coreseek安裝到何處;比如--prefix=/usr/local/coreseek
(以下全部示例都假定Coreseek安裝在這個位置)--with-mysql
, 當自動檢測失敗時,指出在那里能找到MySQL 頭文件和庫文件;--with-pgsql
, 指出在那里能找到PostgreSQL頭文件和庫文件.--with-mmseg
, 啟用基於MMSeg的中文分詞法,並指出在那里能找到MMSeg頭文件和庫文件.--with-python
, 啟用Python數據源支持. 需要預先安裝Python2.6.
4)編譯源代碼生成二進制程序:
$ make $ make install
5、Coreseek快速配置
1)創建配置文件.
缺省的配置文件名為 csft.conf
. 全部的Sphinx/Coreseek提供的程序默認都在當前工作的目錄下尋找該文件.
由configure
程序生成的示例配置文件sphinx.conf.dist
中包括全部選項的注釋,復制並編輯這個文件使之適用於你的具體情況: (請確認 Sphinx/Coreseek 安裝在 /usr/local/coreseek/
)
$ cd /usr/local/coreseek/etc $ cp sphinx.conf.dist csft.conf $ vi csft.conf
coreseek配置文件解析:
- source:數據源,數據是從什么地方來的。
- index:索引,當有數據源之后,從數據源處構建索引。索引實際上就是相當於一個字典檢索。有了整本字典內容以后,才會有字典檢索。
- searchd:提供搜索查詢服務。它一般是以deamon的形式運行在后台的。
- indexer:構建索引的服務。當要重新構建索引的時候,就是調用indexer這個命令。
- attr:屬性,屬性是存在索引中的,它不進行全文索引,但是可以用於過濾和排序。
具體配置源信息,請見官方文檔:http://www.coreseek.com/products-install/datasource/
#源定義 source xml { type = xmlpipe2 xmlpipe_command = bin\cat var/test/test.xml #此處也可使用其他可執行程序輸出xml數據 } #index定義 index xml { source = xml #對應的source名稱 path = var/data/xml docinfo = extern mlock = 0 morphology = none min_word_len = 1 html_strip = 0 #charset_dictpath = /usr/local/mmseg3/etc/ #BSD、Linux環境下設置,/符號結尾 charset_dictpath = etc/ #Windows環境下設置,/符號結尾 charset_type = zh_cn.utf-8 }
2)運行indexer
為你的數據創建全文索引:
$ cd /usr/local/coreseek/etc
$ /usr/local/coreseek/bin/indexer --all
3)測試索引:
$ cd /usr/local/coreseek/etc
$ /usr/local/coreseek/bin/search test
或者
/usr/local/coreseek/bin/search -c /usr/local/coreseek/etc/csft.conf 測試索引
6、通過PHP代碼調用索引
1)運行守護進程searchd,PHP腳本需要連接到searchd上進行檢索:
$ cd /usr/local/coreseek/etc
$ /usr/local/coreseek/bin/searchd
2)運行PHP API 附帶的test 腳本(運行之前請確認searchd守護進程已啟動):
$ cd /源代碼目錄/coreseek/api
$ php test.php test
當然,這是直接包含coreseek的api接口文件的方式來調用索引,還可以通過安裝 sphinx的php擴展來調用(不過客戶端版本和服務端版本要保持一致)
測試代碼為:
$sphinx = new SphinxClient(); $sphinx->SetServer ( 'x.x.x.x', 9312 ); $sphinx->SetArrayResult ( true );//設置返回結果集為php數組格式 // $sphinx->SetLimits(0, 20, 1000);//匹配結果的偏移量,參數的意義依次為:起始位置,返回結果條數,最大匹配條數 //最大搜索時間 // $sphinx->SetMaxQueryTime(10); //索引源是配置文件中的 index 類,如果有多個索引源可使用,號隔開:'email,diary' 或者使用'*'號代表全部索引源 $index = 'index'; $sphinx->setMatchMode(SPH_MATCH_ALL); // $sphinx->setMaxQueryTime(30); //設置最大搜索時間 // $sphinx->SetArrayResult(false); //是否將Matches的key用ID代替 // $sphinx->SetSelect ( "*" ); //設置返回信息的內容,等同於SQL // $sphinx->SetRankingMode(SPH_RANK_BM25); //設置評分模式,SPH_RANK_BM25可能使包含多個詞的查詢的結果質量下降。 $result = $sphinx->query("測試", $index); $err = $sphinx->GetLastError(); echo '<pre>'; print_r($result); print_r($err); echo '</pre>';
6、擴展詞庫
雖然coreseek自帶了中文詞庫,但是畢竟只是基礎詞庫,如果我們需要一些行業詞庫,則可以自己擴展詞庫。
1)首先要到搜狗下載詞庫:http://pinyin.sogou.com/dict/
2)轉換詞庫為文本文件
網上找一個搜狗轉 google的小工具,用它把你下載的全部詞庫轉成文本文件, 生成為一個文件命名為words.txt。文件要用utf8編碼保存。
如果你想自己轉換請參考官網上的方法:http://www.coreseek.cn/opensource/mmseg/
3)轉換文本文件為 詞庫格式
現在我們有了一個初步的詞庫,但這個詞庫還不能直接使用,要再整理並轉換coreseek使用的格式才行,通過PHP代碼來轉換
ini_set('display_errors', 'On'); error_reporting(E_ALL); date_default_timezone_set ('Asia/Shanghai'); set_time_limit(0); $buffer = ini_get('output_buffering'); if($buffer){ ob_end_flush(); } echo '處理新詞庫...'.PHP_EOL; flush(); $filename = "words.txt"; $handle = fopen ($filename, "r"); $content = fread ($handle, filesize ($filename)); fclose ($handle); $content = trim($content); $arr1 = explode( "\r\n" ,$content ); $arr1 = array_flip(array_flip($arr1)); foreach($arr1 as $key=>$value){ $value = dealchinese($value); if(!empty($value)){ $arr1[$key] = $value; }else{ unset($arr1[$key]); } } echo '處理原來詞庫...'.PHP_EOL; flush(); $filename2 = "unigram.txt"; $handle2 = fopen ($filename2, "r"); $content2 = fread ($handle2, filesize ($filename2)); fclose ($handle2); $content2 = dealchinese($content2,"\r\n"); $arr2 = explode( "\r\n" ,$content2 ); echo '刪除相同詞條...'.PHP_EOL; flush(); $array_diff = array_diff($arr1,$arr2); echo '格式化詞庫...'.PHP_EOL; flush(); $words=''; foreach($array_diff as $k => $word){ $words .= $word."\t1".PHP_EOL."x:1".PHP_EOL; } //echo $words; file_put_contents('words_new.txt',$words,FILE_APPEND); echo 'done!'; function dealChinese($str, $join=''){ preg_match_all('/[\x{4e00}-\x{9fff}]+/u', $str, $matches); //將中文字符全部匹配出來 $str = join($join, $matches[0]); //從匹配結果中重新組合 return $str; }
4)生成新的詞庫
運行完后會在相同目錄下生產 words_new.txt把這個文件加到原unigram.txt的后面,保存備用.
把上面得到的文件unigram.txt復制到/usr/local/mmseg-3.2.14/etc/
cd /usr/local/mmseg-3.2.14/etc/ /usr/local/mmseg-3.2.14/bin/mmseg -u unigram.txt
該命令執行后,將會在unigram.txt所在目錄中產生一個名為unigram.txt.uni的文件,將該文件改名為uni.lib,完成詞典的構造。
5)測試新的詞庫
新建測試文件 test.txt,里面寫入你要測試的文本
/usr/local/mmseg-3.2.14/bin/mmseg -d /usr/local/mmseg-3.2.14/etc/ test.txt
也就是
mmseg -d <dict_dir> test.txt
其中,命令使用‘-d’開關指定詞庫文件所在的位置,參數dict_dir為詞庫文件(uni.lib )所在的目錄;text.txt 為待切分的文本文件,必須為UTF-8編碼。如果一切正確,mmseg會將切分結果以及所花費的時間顯示到標准輸出上。
7、coreseek常用命令
啟動 /usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft.conf 停止 /usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft.conf --stop 建立索引 /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf --all 重建索引 /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf --all --rotate