天天看點

LAMP+Coreseek+sphinx建構中文檢索引擎

什麼是Sphinx/Coreseek

Sphinx是一個在GPLv2下分發的全文檢索引擎;Coreseek是一個可供企業使用的、基于Sphinx(可獨立于Sphinx原始版本運作)的中文全文檢索引擎,按照GPLv2協定發行,商業使用(例如, 嵌入到其他程式中)需要聯系我們以獲得商業授權。

一般而言,Sphinx是一個獨立的全文搜尋引擎;而Coreseek是一個支援中文的全文搜尋引擎,意圖為其他應用提供高速、低空間占用、高結果相關度的中文全文搜尋能力。Sphinx/Coreseek可以非常容易的與SQL資料庫和腳本語言內建。

目前系統内置MySQL和PostgreSQL 資料庫資料源的支援,也支援從管道标準輸入讀取入特定格式的XML資料。通過修改源代碼,使用者可以自行增加新的資料源(例如:其他類型的DBMS的原生支援)。在最新的版本中,使用者還可以使用Python腳本作為資料源來擷取任何已知世界和未知世界的資料,這極大的擴充了資料源的來源。

搜尋API支援PHP、Python、Perl、Rudy和Java,并且也可以用作MySQL存儲引擎。搜尋API非常簡單,可以在若幹個小時之内移植到新的語言上。

Sphinx 是SQL PhraseIndex的縮寫,但不幸的和CMU的Sphinx項目重名。

Coreseek  http://www.coreseek.cn 為Sphinx在中國地區的使用者提供支援服務.   

Sphinx  http://sphinxsearch.com/               

Sphinx/Coreseek 的特性

高速的建立索引(在當代CPU上,峰值性能可達到10MB/秒);

高性能的搜尋(在2 – 4GB 的文本資料上,平均每次檢索響應時間小于0.1秒);

可處理海量資料(目前已知可以處理超過100GB的文本資料, 在單一CPU的系統上可處理100 M 文檔);

提供了優秀的相關度算法,基于短語相似度和統計(BM25)的複合Ranking方法;

支援分布式搜尋;

提供文檔片段(摘要以及高亮)生成功能;

可作為MySQL的存儲引擎提供搜尋服務;

支援布爾、短語、詞語相似度等多種檢索模式;

文檔支援多個全文檢索字段(預設配置下,最大不超過32個);

文檔支援多個額外的屬性資訊(例如:分組資訊,時間戳等);

停止詞查詢;

支援單一位元組編碼和UTF-8編碼,以及對GBK和BIG5的完善支援;

支援英語、俄語詞詞幹化和Soundex,以便進行詞形學處理;

原生的MySQL支援(同時支援MyISAM 和InnoDB );

原生的PostgreSQL支援;

支援直接模拟為MySQL服務端運作;

支援MMSeg分詞引擎,使用者可自定義詞典;

Python資料源支援,得以擷取任何已知世界和未知世界的資料.

目前,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用于提供中文分詞和詞典處理。

安裝前準備環境

yum install make gcc g++ gcc-c++ libtool make mysql-devel libxml2-devel expat-devel 

官網參考位址:http://www.coreseek.cn/products/products-install/install_on_bsd_linux/RHEL5-5/

來到官網http://www.coreseek.com/下載下傳Coreseek 3.2.14穩定版,解壓進入目錄。

# tar xf coreseek-3.2.14.tar.gz

# cd coreseek-3.2.14

配置語言支援中文

# export LANG="zh_CN.UTF-8"

# export LC_ALL="zh_CN.UTF-8"

# cat testpack/var/test/test.xml

<a href="http://s3.51cto.com/wyfs02/M01/54/4C/wKiom1R-i4bgy4L2AAGxpagGNaw469.jpg" target="_blank"></a>

安裝coreseek開發的mmseg,為coreseek提供中文分詞功能

# cd mmseg-3.2.14/

# ./bootstrap

# ./configure --prefix=/usr/local/mmseg3

# make &amp;&amp; make install

中文分詞測試

# /usr/local/mmseg3/bin/mmseg -d /usr/local/mmseg3/etc src/t1.txt

中文/x 分/x 詞/x 測試/x

中國人/x 上海市/x

Word Splite took: 0 ms.

安裝coreseek

# cd csft-3.2.14/

# sh buildconf.sh

1

<code>.</code><code>/configure</code> <code>--prefix=</code><code>/alidata/server/sphinx/coreseek</code> <code>--without-python --without-unixodbc --with-mmseg --with-mmseg-includes=</code><code>/alidata/server/sphinx/mmseg3/include/mmseg</code> <code>--with-mmseg-libs=</code><code>/alidata/server/sphinx/mmseg3/lib/</code> <code>--with-mysql=</code><code>/alidata/server/mysql</code>  <code>--with-mysql-includes=</code><code>/alidata/server/mysql/include/</code>

測試是否可以正常運作

# /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/sphinx-min.conf.dist

<a href="http://s3.51cto.com/wyfs02/M02/54/4B/wKioL1R-jGuw-AWdAAFTJpw38mI702.jpg" target="_blank"></a>

csft-4.0版顯示:ERROR: nothing to do.

coreseek中文全文檢索測試

# cd testpack/

# /usr/local/coreseek/bin/indexer -c etc/csft.conf

<a href="http://s3.51cto.com/wyfs02/M02/54/4C/wKiom1R-jEfDtn-DAAEXq729j_8678.jpg" target="_blank"></a>

索引全部資料

# /usr/local/coreseek/bin/indexer -c etc/csft.conf -all

<a href="http://s3.51cto.com/wyfs02/M01/54/4B/wKioL1R-jcrxJ2dNAAG8p9tFa-I285.jpg" target="_blank"></a>

索引指定資料

# /usr/local/coreseek/bin/indexer -c etc/csft.conf xml

<a href="http://s3.51cto.com/wyfs02/M01/54/4D/wKiom1R-kE2BkFSPAAGH6upCW9M497.jpg" target="_blank"></a>

測試搜尋

# /usr/local/coreseek/bin/search -c etc/csft.conf

<a href="http://s3.51cto.com/wyfs02/M02/54/4D/wKiom1R-kM_gwWq9AAFuX0pLqho609.jpg" target="_blank"></a>

測試搜尋關鍵詞

# /usr/local/coreseek/bin/search -c etc/csft.conf -a hello歡迎來到北京清華大學

<a href="http://s3.51cto.com/wyfs02/M00/54/4D/wKiom1R-kQ_z2PkyAAFde5WUkvA847.jpg" target="_blank"></a>

開啟搜尋服務

# 如要已啟動服務,要更新索引,請使用 /usr/local/coreseek/bin/indexer-c etc/csft.conf --all --rotate

# 如要停止搜尋服務,請使用 /usr/local/coreseek/bin/searchd-c etc/csft.conf --stop

然後,請參考csft-3.2.14下api目錄中的相關檔案,使用PHP、Python、Ruby、Java來測試搜尋服務;也可以前往&lt; ahref="/products-install/step_by_step/"&gt;搜尋服務建立三步曲,檢視第三步使用PHP測試。

通過以上步驟,coreseek已經安裝測試完成,可以提供正常的xml資料源索引以及提供對應的搜尋服務了,下一步工作,請檢視手冊,準備好mysql資料資訊,以及進行mysql資料源的測試,并在您的應用中調用搜尋服務;mysql資料源的配置可參考testpack/etc/csft_mysql.conf檔案

快速安裝位址:http://www.coreseek.cn/product_install/install_on_bsd_linux/#mysql

在實作以上功能之後,即可開始下面的實驗。

LAMP+Coreseek+sphinx建構中文檢索引擎

安裝好LAMP環境,并将它們啟動(略),在前面的文章中都有講到。

1、  先給資料庫插入一些資料,用于測試,在解壓coreseek源碼包後可以在/coreseek-4.1-beta/testpack/var/test/找到.sql的資料庫腳本檔案,導入資料庫即可。

2、  安裝PHP的sphinx擴充

可以在這裡(http://pecl.php.net/package/sphinx)找到sphinx的php擴充源碼,注意,使用phpize,configure的時候可能會要求要安裝libsphinxclient,它在coreseek-4.1-beta/csft-4.1/api/libsphinxclient/裡面能找到,編譯安裝它以後就可以configure,make,生成動态so檔案了。

3、  給服務提供配置檔案 (源碼目錄下有樣例:  /coreseek-4.1-beta/testpack/etc/csft_mysql.conf)

#源定義

source study

{

        type                                    = mysql

        sql_host                                = localhost

        sql_user                                = root

        sql_pass                                =

        sql_db                                  = test

        sql_port                                = 3306

        sql_query_pre                   = SET NAMES utf8

        sql_query                               = select id,title,content,group_id from documents;

// 這裡使用select 将想要被用于檢索的索引字段查出來,緩存于Sphinx伺服器中,sql_query第一列id需為整數,title、content作為字元串/文本字段,被全文索引

        sql_query_info                  = SELECT * FROM documents where id=$id  

 #僅被指令行搜尋所用,用來擷取和顯示文檔資訊,目前僅對MySQL有效,且僅用于調試目的。此查詢為每個文檔ID擷取CLI搜尋工具要顯示的文檔資訊。它需要包含<code>$id</code>宏,以此來對應到查詢的文檔的ID。

}

#index定義

index study

        source                  = study             #對應的source名稱

        path                    = /usr/local/coreseek/var/data/study

        docinfo                 = extern

        mlock                   = 0

        morphology              = none   //不使用任何詞形處理器

        min_word_len            = 1      //最小索引詞長度。可選選項,預設為1(索引任何詞)

        html_strip                              = 0

        charset_dictpath = /usr/local/mmseg3/etc/    //設定中文分詞詞典所在的目錄

        #charset_dictpath = etc/        

        charset_type            = zh_cn.utf-8

source mysql

        sql_db                                  = tuchao

        sql_query                               = SELECT id, title, abstract FROM ic_video

        sql_query_info                  = SELECT * FROM ic_video where id=$id  

index mysql

        source                  = mysql            

        path                    = /usr/local/coreseek/var/data/mysql

        morphology              = none

        min_word_len            = 1

        charset_dictpath = /usr/local/mmseg3/etc/  

        #charset_dictpath = etc/   

source qupeiyin

        sql_db                                  = tuchao2

        sql_query                               = SELECT id, title, description FROM course

        sql_query_info                  = SELECT * FROM course where id=$id  

index qupeiyin

        source                  = qupeiyin  

        path                    = /usr/local/coreseek/var/data/qupeiyin

        #charset_dictpath = etc/  

#全局index定義

indexer

        mem_limit                       = 128M    //索引過程記憶體限制,indexer不會超越的強制記憶體限制,設定太低會影響索引速度,一般為256M~1024M,最大限制是2048M.

#searchd服務定義

searchd

    listen                  =   9312

        read_timeout            = 5  //網絡用戶端請求的讀逾時時間, <code>searchd</code> 強制關閉在此時間内未能成功發出查詢的用戶端連接配接。

        max_children            = 30  //子程序的最大數量,任何時候不可能有比此設定值更多的搜尋同時運作。當達到限制時,新的輸入用戶端會被用臨時失敗(SEARCH_RETRY)狀态碼駁回;

        max_matches                     = 1000   //為每個索引所保持并傳回給用戶端的比對數目的最大值

        seamless_rotate         = 1                          //啟用無縫輪換,資料輪換時不暫停搜尋服務。

        preopen_indexes         = 0

        unlink_old                      = 1    //索引輪換成功之後,是否删除以.old為擴充名的索引拷貝。可選選項,預設為1(删除這些索引拷貝)。

        pid_file = /usr/local/coreseek/var/log/searchd_mysql.pid

        log = /usr/local/coreseek/var/log/searchd_mysql.log

        query_log = /usr/local/coreseek/var/log/query_mysql.log

在寫配置檔案的時候,sourece名稱可以與index名稱不一樣,但是path後的名稱一定要和index定義的名稱一緻。

4、提供服務啟動腳本

#!/bin/bash

# searchd - this script start and stop the searchd daemon

#

# chkconfig - 85 20

# description: 

# processname: searchd

# config:  /usr/local/coreseek/etc/csft_mysql.conf

. /etc/rc.d/init.d/functions

searchd="/usr/local/coreseek/bin/searchd"

prog=$(basename $searchd)

conf_file="/usr/local/coreseek/etc/csft_mysql.conf"

lockfile="/var/lock/subsys/searchd"

start() {

    [ -e $lockfile ] &amp;&amp; echo "searchd is already start" &amp;&amp; exit 0

    [ -x $searchd ] || exit 1

    [ -f $conf_file ] || exit 2

    echo -n "Starting $prog:"

    daemon $searchd -c $conf_file

    retval=$?

    echo

    if [ $retval -eq 0 ]; then

       touch $lockfile

    else

        echo "$prog is starting failed"

    fi

        return $retval

stop() {

    echo -n $"Stopping $prog:"

    killproc $prog -QUIT

       rm -rf $lockfile

restart() {

stop

sleep 1

start

indexer() {

/usr/local/coreseek/bin/indexer -c $conf_file --all

case "$1" in

        start)

             start

             ;;

        stop)

            stop

            ;;

        restart)

            restart

        indexer)

           indexer

        *)

           echo "Usage:$0 {start|stop|restart|indexer}"

           exit 2

esac

5、  重建全部索引

# /etc/init.d/searchd indexer

<a href="http://s3.51cto.com/wyfs02/M00/57/36/wKioL1SVGm_C--PGAAGBaCYcCW8559.jpg" target="_blank"></a>

6、  啟動searchd服務

# service searchd start

<a href="http://s3.51cto.com/wyfs02/M01/57/38/wKiom1SVGfCCWZAkAAG2-9Ntc5o667.jpg" target="_blank"></a>

7、  提供PHP測試程式

&lt;?php

$s = new SphinxClient;

$s-&gt;setServer("localhost", 9312);

$s-&gt;setArrayResult(true);

$s-&gt;setSelect();

$s-&gt;setMatchMode(SPH_MATCH_ALL);

//SPH_MATCH_ALL這個檢索方法表示隻顯示比對到的資料ID,并進行分詞。SPH_MATCH_ANY表示先将搜尋的内容進行分詞,輸出每個分詞比對到的資料ID。

$result1 = $s-&gt;query('喬布斯','mysql');

$result2 = $s-&gt;query('搞笑','qupeiyin');

$result3 = $s-&gt;query('Google','study');

print_r($result1);

print_r($result2);

print_r($result3);

?&gt;

8、測試服務

    我可以在httpd伺服器指定的目錄下建立一個test.php拷貝以上代碼,根據自己的資料庫資料做更改後儲存。

這一句我要講下: $result1 = $s-&gt;query('喬布斯','mysql');  “喬布斯“是搜尋的關鍵詞,後面的’mysql ’對應的是定義在csft_mysql.conf中的索引名稱。表示從哪個索引中找

以下是用浏覽器通路test.php傳回的結果:

<a href="http://s3.51cto.com/wyfs02/M00/57/36/wKioL1SVHA3zks_OAALbYkfToLo666.jpg" target="_blank"></a>

    首先傳回結果是在mysql索引中搜尋關鍵詞‘喬布斯’ 的,可以看到在id=&gt;38 、id=&gt;39  有比對到,而且對搜集内容進行了分詞。

[matches] =&gt; Array ( [0] =&gt; Array ([id] =&gt; 38 [weight] =&gt; 6 [attrs] =&gt; Array ( ) ) [1] =&gt; Array ( [id]=&gt; 39 [weight] =&gt; 3 [attrs] =&gt; Array ( ) ) ) [total] =&gt; 2 [total_found]=&gt; 2 [time] =&gt; 0.002 [words] =&gt; Array ( [喬] =&gt;Array ( [docs] =&gt; 2 [hits] =&gt; 3 ) [布] =&gt; Array ([docs] =&gt; 2 [hits] =&gt; 3 ) [斯] =&gt; Array ( [docs] =&gt; 2 [hits] =&gt; 3 ) ) )

我們上MySQL伺服器查找對應ID來驗證:

<a href="http://s3.51cto.com/wyfs02/M00/57/39/wKiom1SVG6yCXgugAAQlK5NWBiE542.jpg" target="_blank"></a>

    我們再分析後續的輸出結果,在qupeiyin索引中搜尋‘ 搞笑’ 關鍵詞,這裡可以看到在id=&gt;29 、 id=&gt;518  有比對到.

Array ( [error] =&gt; [warning] =&gt;[status] =&gt; 0 [fields] =&gt; Array ( [0] =&gt; title [1] =&gt; description )[attrs] =&gt; Array ( ) [matches] =&gt; Array ( [0] =&gt; Array ( [id] =&gt; 29 [weight] =&gt; 1 [attrs] =&gt; Array () ) [1] =&gt; Array ( [id] =&gt; 518 [weight]=&gt; 1 [attrs] =&gt; Array ( ) ) ) [total] =&gt; 2 [total_found] =&gt; 2[time] =&gt; 0.002 [words] =&gt; Array ( [搞笑] =&gt; Array ([docs] =&gt; 2 [hits] =&gt; 2 ) ) )

我們再來到資料庫驗證:

<a href="http://s3.51cto.com/wyfs02/M01/57/39/wKiom1SVHAni20lhAAI7IldQj_M848.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M02/57/36/wKioL1SVHLyAsyxwAAKuxXjR0SA840.jpg" target="_blank"></a>

第三個輸出也是可以找到對應的資料的,筆者就不上圖了,由此可以看出,在對應的ID号确實能找到比對的資料。

本文轉自qw87112 51CTO部落格,原文連結:http://blog.51cto.com/tchuairen/1585871