Sphinx以及coreseek的安裝及使用

檢索結構
php  ->  sphinx  -> mysql
非結構化數據又叫全文數據,非固定長度字段例如文章標題搜索這類適用sphinx

全文數據搜索:
1 順序掃描 : 如like查找
2 索引掃描 : 把非結構化數據中的內容提取出來一部分從新組織,這部分數據就叫作索引

全文檢索分爲兩個過程
1.建立索引
2.搜索索引

建立索引:
sphinx經過語言處理組件會把搜索語句中的標點符號,語氣助詞給過濾掉,而後處理完畢後會
分析出一些詞語,傳給索引組件,而後排序去除重複詞語.

搜索索引:
搜索關鍵字 提交 -> sphinx 分析出文檔ID -> mysql經過ID查詢數據並返回


中文分詞須要coreseek
coreseek 支持中文的全文檢索引擎

sphinx的安裝
下載源碼包 進行源碼安裝
./configure --prefix=/usr/local/sphinx --with-mysql=/usr/local/mysql
make && make install

sphinx 中重要的三個命令(bin目錄下)
Indexer 建立索引命令
Searchd 啓動進程命令
Search 命令行搜索命令

配置sphinx
cd /usr/local/sphinx/etc
cp sphinx.conf.dist sphinx.conf
vi sphinx.conf

配置文件
名爲main的主數據源:source main{}
繼承名爲main的增量數據源:source delta:main{}
名爲main的主索引:index main{}
繼承名爲main的增量索引:index delta:main{}
分佈式索引:index dist1{}
索引器:indexer{}
服務進程:searchd{}

修改配置文件中主數據源的mysql配置,測試環境的數據源名爲main,假設mysql中test有張表叫post
source main
{
    # data source type. mandatory, no default value
    # known types are mysql, pgsql, mssql, xmlpipe, xmlpipe2, odbc
    type                    = mysql

    #####################################################################
    ## SQL settings (for 'mysql' and 'pgsql' types)
    #####################################################################

    # some straightforward parameters for SQL source types
    sql_host                = localhost
    sql_user                = root
    sql_pass                = admin
    sql_db                = test
    sql_port                = 3306    # optional, default is 3306

    
    sql_sock                = /tmp/mysqld.sock  #若是是linux下須要開啓,指定sock文件

    sql_query_pre            = SET NAMES utf8   
    sql_query_pre            = SET SESSION query_cache_type=OFF #關閉緩存


    # main document fetch query
    # mandatory, integer document ID field MUST be the first selected column
    sql_query                = \                              #獲取數據的sql語句
        SELECT id,title,content FROM post

    
    #sql_attr_uint            = group_id                  #對排序字段進行註釋

    
    #sql_attr_timestamp        = date_added            #對排序字段進行註釋


    sql_query_info        = SELECT * FROM post WHERE id=$id

    
}
註釋掉全部增量數據源,修改主索引

index main
{
        source                  = main

        # index files path and file name, without extension
        # mandatory, path must be writable, extensions will be auto-appended
        path                    = /usr/local/sphinx/var/data/main
 
        docinfo                 = extern
        mlock                   = 0
        morphology              = none
        # default is 1 (index everything)
        min_word_len            = 1

        # charset encoding type
        # optional, default is 'sbcs'
        # known types are 'sbcs' (Single Byte CharSet) and 'utf-8'
        charset_type            = utf-8
        # 'utf-8' default value is
        # charset_table          = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F

}

註釋掉全部的增量索引和分佈式索引



配置完成後,建立索引
命令 indexer
-c 指定配置文件
--all 對全部索引從新編制索引
--rotate 用於輪換索引,主要是在不中止服務的時候,增長索引
--merge 合併索引
/usr/local/sphinx/sbin/indexer -c 
/usr/local/sphinx/etc/sphinx --all
若是報錯./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory
解決方式:cp /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib/libmysqlclient.so.18

測試
創建索引
[root@localhost bin]# ./indexer --all
Sphinx 0.9.9-release (r2117)
Copyright (c) 2001-2009, Andrew Aksyonoff

using config file '/usr/local/sphinx/etc/sphinx.conf'...
indexing index 'main'...
collected 2 docs, 0.0 MB
sorted 0.0 Mhits, 100.0% done
total 2 docs, 47 bytes
total 0.033 sec, 1414 bytes/sec, 60.21 docs/sec
total 1 reads, 0.000 sec, 0.0 kb/call avg, 0.0 msec/call avg
total 5 writes, 0.000 sec, 0.0 kb/call avg, 0.0 msec/call avg

搜索
[root@localhost bin]# ./search linux1
Sphinx 0.9.9-release (r2117)
Copyright (c) 2001-2009, Andrew Aksyonoff

using config file '/usr/local/sphinx/etc/sphinx.conf'...
index 'main': query 'linux1 ': returned 1 matches of 1 total in 0.000 sec

displaying matches:
1. document=1, weight=1
    id=1
    title=linux1
    content=salflsdkjsdglds

words:
1. 'linux1': 1 documents, 1 hits

sphinx至關於把數據庫數據索引靜態化到本地 來加快查詢速度 避免消耗數據庫,給數據庫給降壓,當數據更新的時候,須要從新indexer --all 或者用 indexer main重建全部索引 纔會搜出新的數據



安裝CORESEEKcoreseek裏有2個文件夾 一個是mmseg中文分詞包 還有一個是csft(其實就是sphinx)包 都要安裝

首先安裝mmseg中文分詞
./configure --prefix=/usr/local/mmseg
編譯時可能會報錯config.status: error: cannot find input file: src/Makefile.in
經過automake來解決
首先檢查是否安裝了libtool若是沒有 
yum -y install libtool
automake
若是automake報錯 緣由多是下列
Libtool library used but `LIBTOOL' is undefined
The usual way to define `LIBTOOL' is to add `AC_PROG_LIBTOOL'
to `configure.ac' and run `aclocal' and `autoconf' again.
If `AC_PROG_LIBTOOL' is in `configure.ac', make sure
its definition is in aclocal's search path.

緣由分析
aclocal是個掃描程序, 負責掃描configure.ac中全部的宏定義並展開,
上面產生的緣由就是找不到LIBTOOL宏的定義之處形成的.緣由就是aclocal與libtool沒有安裝在一個相同目錄下面aclocal是去默認 安裝目錄 /usr/share/aclocal下面搜索全部的.m4文件找所定義的宏,可是因爲安裝了多個aclocal,可能aclocal目錄不存在,實際目錄爲/usr/share/aclocal1.10等,
這就形成了aclocal找不到m4文件的狀況, 解決辦法就是將文件夾aclocal1.10重命名爲aclocal.或者顯示指定路徑 aclocal -I /usr/share/aclocal1.10 -I /usr/share/libtool/m4 --install 或者把/usr/share/libtool/m4下面的文件都copy至/usr/share/aclocal1.10中.
本人的機器上是/usr/share/下有2個文件夾 一個是aclocal,一個是aclocal-1.11,首先將aclocal的全部文件拷貝到aclocal-1.11下
cp -R /user/share/aclocal/* /usr/share/aclocal-1.11/

而後從新運行aclocal和autoconf
aclocal && autoconf
最後再次運行automake
automake

而後繼續mmseg的安裝
./configure --prefix=/usr/local/mmseg
make && make install

若是make 報錯
There is an easy fix when you get such messages as "X--tag=CXX: command not found".
Just type:
export echo=echo
And try again.

因此輸入
export echo=echo
而後再次運行安裝
make && make install


安裝csft
./configure --prefix=/usr/local/coreseek --with-mysql=/usr/local/mysql --with-mmseg=/usr/local/mmseg --with-mmseg-includes=/usr/local/mmseg/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg/lib/
make && make install
安裝完畢後 注意 coreseek 中的配置文件也是csft.conf 而不是 sphinx.conf
cd /usr/local/coreseek/etc
cp sphinx.conf.dist csft.conf
vim csft.conf 

有些配置改動以下其餘配置內容如上文的sphinx.conf
在索引源中註釋掉txt
index main{
  #stopwords = G:\data\stopwords.txt
  #wordforms =G:\data\wordforms.txt
  #exceptions =/data/exceptions.txt 
  #charset_type = sbcs
  #添加下面2行 意思是把中文分詞加入到配置文件中
  char_type = zh_cn.utf-8
  charset_dictpath =/usr/local/mmseg/etc/  #你安裝mmseg的目錄
}

保存配置
創建索引
cd /usr/local/coreseek/bin
./indexer --all
./search 中文詞綴


如何用php去使用sphinx
Sphinx集成到php程序中有兩種方式
1.Sphinx php 模塊(此次咱們選擇使用的方式)
2.Sphinx api 類(位於coreseek源碼包裏的csft裏的api文件夾裏有一個sphinxapi.php,使用的時候包含這個php文件便可)

咱們要使用sphinx須要作如下幾件事:
1.首先要有數據
2.創建sphinx配置文件
3.生成索引
4,啓動searchd 服務進程,並開啓端口9312
5.用php客戶程序去連接sphinx服務


/usr/local/coreseek/bin/searchd
啓動進程命令 searchd
-c 指定配置文件
--stop 中止服務
--pidfile 顯示指定pid文件
-p 指定端口(默認9312)
注意:這裏啓動的服務是searchd

使用php  sphinx的模塊
下載 sphinx-1.1.0.tgz

tar zvxf sphinx-1.1.0.tgz
cd sphinx-1.1.0
/usr/local/php/bin/phpize  #用於生成一個configure的腳本
進入coreseek源碼包的csft/api/libsphinxclent 目錄下執行configure
./configure
make && make install
進入sphinx-1.1.0.gzt的源碼包目錄下 執行configure用於生成so 的shpinx模塊
./configure --with-php-config=/usr/local/webserver/php/bin/php-config --with-sphinx
make && make install
安裝成功後會有提示
Build complete.
Don't forget to run 'make test'.

Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/    (這個目錄是sphinx.so所在的目錄)

而後咱們編輯php的ini文件 在extension中加入
extension=sphinx.so

而後重啓nginx和php的服務
最後打印一下phpinfo 查看sphinx是否開啓成功
若是成功開啓 就能夠使用php手冊裏的sphinx的方法和代碼了
相關文章
相關標籤/搜索