Sphinx(coreseek) 安裝使用以及詞庫的擴展


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM