centos6.2 64位下配置Sphinx(斯芬克司)mysql高速搜素引擎

 

Sphinx(斯芬克司)
    Sphinx是一個基於SQL的全文檢索引擎,可以結合MySQL,PostgreSQL做全文搜索,它可以提供比數據庫本身更專業的搜索功能,使得應用程序更容易實現專業化的全文檢索。Sphinx特別爲一些腳本語言設計搜索API接口,如PHP,Python,Perl,Ruby等,同時爲MySQL也設計了一個存儲引擎插件。
  Sphinx 單一索引最大可包含1億條記錄,在1千萬條記錄情況下的查詢速度爲0.x秒(毫秒級)。Sphinx創建索引的速度爲:創建100萬條記錄的索引只需 3~4分鐘,創建1000萬條記錄的索引可以在50分鐘內完成,而只包含最新10萬條記錄的增量索引,重建一次只需幾十秒。

下載安裝包:
然後解壓

[root@localhost src]# tar -zxf sphinx-2.0.6-release.tar.gz
[root@localhost src]# cd sphinx-2.0.6-release
[root@localhost sphinx-2.0.6-release]#./configure --prefix=/usr/local/sphinx --with-mysql=/usr/local/mysql/ --with-iconv
[root@localhost sphinx-2.0.6-release]# make && make install
#在64位系統中,後面還應該加 --enable-id64

然後,我們進入mysql把sphinx帶的模板測試庫導入mysql

[root@localhost sphinx-2.0.6-release]# mysql
mysql> use test
mysql> source /usr/local/sphinx/etc/example.sql;
mysql> quit

修該sphinx配置文件:

[root@localhost sphinx-2.0.6-release]# cd /usr/local/sphinx/etc/
[root@localhost etc]# cp sphinx.conf.dist sphinx.conf
[root@localhost etc]# vim sphinx.conf
sql_host = localhost
sql_user = root
sql_pass = root
sql_db = test
sql_port = 3306

然後保存退出

[root@localhost etc]# /usr/local/sphinx/bin/indexer --all

    這個命令是建立索引,當然數據基礎是剛剛導入的example.sql的數據,如果這裏出錯,最大的可能是你的sphinx.conf中的數據庫配置錯了,你需要回去檢查並修正。但是,還有可能出現sphinx必須的庫文件無法找到,例如出現以下兩種錯誤: 

/usr/local/sphinx/bin/indexer: error while loading shared libraries: libmysqlclient.so.15: cannot open shared
object file: No such file or directory
/usr/local/sphinx/bin/indexer: error while loading shared libraries: libiconv.so.2: cannot open shared object file:
No such file or directory

    這主要是因爲你安裝了一些庫後,沒有能夠配置相應的環境變量。你可以通過建立連接的方式修正這個問題,運行如下命令: 

[root@localhost etc]# ln -s /usr/local/mysql/lib/libmysqlclient.so.15 /usr/lib/libmysqlclient.so.15
[root@localhost etc]# ln -s /usr/local/lib/libiconv.so.2 /usr/lib/libiconv.so.2 

    這裏我假設你相應的軟件包安裝在/usr/local/xxx 目錄下,如果你不是安裝在相應目錄下,你就需要使用你自己的路徑。如果你沒有安裝libiconv軟件包,則需要安裝下,這個安裝比較簡單,就不多說了。
    如果還出現類似錯誤,照上面的方法修正。 

[root@localhost etc]# /usr/local/sphinx/bin/indexer --all --config /usr/local/sphinx/etc/sphinx.conf --rotate
[root@localhost etc]# /usr/local/sphinx/bin/search test

Sphinx 2.0.1-id64-beta (r2792)
Copyright (c) 2001-2011, Andrew Aksyonoff
Copyright (c) 2008-2011, Sphinx Technologies Inc (http://sphinxsearch.com)

using config file '/usr/local/sphinx/etc/sphinx.conf'...
index 'test1': query 'test ': returned 3 matches of 3 total in 0.015 sec
displaying matches:
1. document=1, weight=2421, group_id=1, date_added=Mon Nov 19 16:57:01 2012
                id=1
                group_id=1
                group_id2=5
                date_added=2013-01-07 14:12:18
                title=test one
                content=this is my test document number one. also checking search within phrases.
2. document=2, weight=2421, group_id=1, date_added=Mon Nov 19 16:57:01 2012
                id=2
                group_id=1
                group_id2=6
                date_added=2013-01-07 14:12:18
                title=test two
                content=this is my test document number two
3. document=4, weight=1442, group_id=2, date_added=Mon Nov 19 16:57:01 2012
                id=4
                group_id=2
                group_id2=8
                date_added=2013-01-07 14:12:18
                title=doc number four
                content=this is to test groups

words:
1. 'test': 3 documents, 5 hits

index 'test1stemmed': query 'test ': returned 3 matches of 3 total in 0.000 sec

displaying matches:
1. document=1, weight=2421, group_id=1, date_added=Mon Nov 19 16:57:01 2012
                id=1
                group_id=1
                group_id2=5
                date_added=2013-01-07 14:12:18
                title=test one
                content=this is my test document number one. also checking search within phrases.
2. document=2, weight=2421, group_id=1, date_added=Mon Nov 19 16:57:01 2012
                id=2
                group_id=1
                group_id2=6
                date_added=2013-01-07 14:12:18
                title=test two
                content=this is my test document number two
3. document=4, weight=1442, group_id=2, date_added=Mon Nov 19 16:57:01 2012
                id=4
                group_id=2
                group_id2=8
                date_added=2013-01-07 14:12:18
                title=doc number four
                content=this is to test groups

words:
1. 'test': 3 documents, 5 hits

index 'rt': search error: /usr/local/sphinx/var/data/rt.sph is invalid header file (too old index version?).

 上面的命令是搜索測試,測試的關鍵詞就是 test 了,如果成功的話,你應該看到搜到的結果,出現字串“index 'test1': query 

'test ': returned 3 matches of 3 total in 0.000 sec”,後面跟的是結果表示成功了。  

[root@localhost etc]# /usr/local/sphinx/bin/searchd
[root@localhost etc]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 1077/php-fpm
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 1416/rsync
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1373/mysqld
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1418/nginx
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1094/sshd
tcp 0 0 0.0.0.0:9306 0.0.0.0:* LISTEN 3684/searchd
tcp 0 0 0.0.0.0:9312 0.0.0.0:* LISTEN 3684/searchd

tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 1427/zabbix_agentd
tcp 0 0 0.0.0.0:10051 0.0.0.0:* LISTEN 1439/zabbix_server

Sphinx.conf 配置文檔參數解釋

其結構組成主要如下 :
Source 源名稱 1{ // 指定數據源
一些配置
}
Index 索引名稱 1{
Source= 源名稱 1
}
Source 源名稱 2{
一些配置
}
Index 索引名稱 2{
Source= 源名稱 2
}
Indexer{
mem_limit = 32M
}
Searchd{ // 配置 searchd 守護程序本身
}
二. Source 源名稱 相關配置說明
Type= 數據庫類型 (Mysql 或 SQL);
Sql_host= 數據庫主機地址 ( 如果是外網 , 請確保防火牆允許鏈接 )
Sql_user= 數據庫用戶名
Sql_pass= 數據庫密碼
Sql_db= 數據庫名稱
Sql_port= 數據庫端口
Sql_query_pre= 執行 SQL 前設置的編碼 (SET NAMES UTF8/GBK)
#下面的語句是更新sph_counter表中的 max_doc_id。
sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(id) FROM document

Sql_query= 全文檢索要顯示的內容 , 據官方說法 : 儘可能不要使用 WHERE 或 GROUPBY , 將其交給 SPHINX 效率會更高 ;select 出來的字段必須包含至少一個唯一主鍵 , 以及全文檢索的字段
Sql_query_info=
SELECT * FROM Inventory WHERE id=$id
Strip_html= 0/1 是否去掉 HTML 標籤
Sql_attr_uint= 無符號整數屬性 , 可以設置多個 , 設置數據庫字段 , 設置哪個能顯示出哪個字段數據的整形來 .
Sql_attr_float 浮點型
Sql_attr_timestamp 時間戳
Sql_attr_str2ordinal字符串型 這個屬性類型(簡稱爲字串序數)的設計是爲了允許按字符串值排序,但不存儲字符串本身。
三. Index 中配置說明
Source= 數據源名稱
Path = 索引記錄存放目錄 , 注 : d:/sphinx/data/cg 這個的意思是 在 data 目錄下創建一個名爲 cg 的文件
min_word_len= 索引的詞的最小長度 設爲 1 既可以搜索單個字節搜索 , 越小 索引越精確 , 但建立索引花費的時間越長
charset_type= utf-8/gbk 設置數據編碼
charset_table= 字符表和大小寫轉換規則 . 頻繁應用於 sphinx 的分詞過程
min_prefix_len = 最小前綴 (0)
min_infix_len = 最小中綴 (1)
//以下三句是關於UTF-8中文一元分詞的配置
ngram_len = 對於非字母型數據的長度切 (1)
charset_table = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F
ngram_len = 1
ngram_chars = U+3000..U+2FA1F
四. searchd 配置說明
port= sphinx 的端口 (9312)
log= 服務進程日誌存放路徑,一旦 sphinx 出現異常,基本上可以從這裏查詢有效信息
query_log= 客戶端查詢日誌 尤爲有用 它將在運行時顯示每次搜索並顯示結果
read_timeout= 請求超時 (5)
max_children= 同時可執行的最大 searchd 進程數 (30)
pid_file= 進程 ID 文件
max_matches= 查詢結果的最大返回數
seamless_rotate= 是否支持無縫切換,做增量索引時通常需要 (0/1)
至此 spninx.conf 配置文件結束 ; 注意 : 如果有換行 必須用反斜槓 \ 鏈接
五. sphinx 建立所以 及監聽
切換到 DOS sphinx/bin 目錄下
1. 建立索引
Indexer –c sphinx.conf 索引名稱 /--all (--all 參數是建立所有索引 )
完成後提示如下 :
total 535600 docs, 10707632 bytes
total 34.323 sec, 311958 bytes/sec, 15604.27 docs/sec
total 5 reads, 0.282 sec, 45592.6 kb/call avg, 56.4 msec/call avg
total 547 writes, 12.172 sec, 1017.0 kb/call avg, 22.2 msec/call avg
2. 建立完成後
可以執行 search [–c] sphinx.conf 搜索內容 (-c 參數 : 是否允許模糊搜索 )
3. 監聽端口
Searchd
運行後 提示
listening on all interfaces, port=9312
accepting connections
監聽成功後 既可以運行 PHP 程序 進行 搜索
PHPCODE:
require("sphinxapi.php"); // 加載類文件
$cl=new SphinxClient(); // 實例化類
$cl->SetServer('localhost',9312); // 設置服務
$search->setSearch_start(($page -1) * $pageSize);//分頁
$search->setSearch_limit($pageSize * 1);
$cl->SetArrayResult(true); // 設置 顯示結果集方式
$cl->SetLimits(0,10); // 同 sql 語句中的 LIMIT
$cl->SetSortMode(“mode”); // 排序模式 SPH_SORT_ATTR_DESC 和 SPH_SORT_ATTR_ASC
$result=$cl->Query('ff',[ 索引名稱可選 ]); // 執行搜索,索引名稱指的是下面例子中的member, member_delta
Var_dump($result); // 輸出

Sphinx.conf 配置文檔案例: 

source member
{
type = mysql


sql_host = localhost
sql_user = XXX
sql_pass = XXX
sql_db = XXX
sql_port = 3306

sql_query_pre = SET NAMES utf8
sql_query_pre = SET SESSION query_cache_type=OFF

sql_query = \
SELECT members.uid as uid,members.username as username FROM members where member_status =1 and uid not in \
(SELECT distinct user_id FROM `fct_faction_member` )

}

source member_delta : member
{

sql_query_pre = SET NAMES utf8
sql_query_pre = SET SESSION query_cache_type=OFF

sql_query = \
SELECT members.uid as uid,members.username as username FROM members where member_status =1 and uid not in \
(SELECT distinct user_id FROM `fct_faction_member` )
}
index member
{
source = member
path = /data0/coreseek/var/data/member_test
docinfo = extern
charset_dictpath = /usr/local/webserver/mmseg/etc/
mlock = 0
morphology = none
min_word_len = 1
html_strip = 0
charset_type = zh_cn.utf-8
ngram_len = 0

}


index member_delta
{
source = member_delta
path = /data0/coreseek/var/data/member_delta_test
docinfo = extern
charset_dictpath = /usr/local/webserver/mmseg/etc/
mlock = 0
morphology = none
min_word_len = 1
html_strip = 0
charset_type = zh_cn.utf-8
ngram_len = 0
}
sphinx的原理是每天定時的去處理一些大的sql語句,將查詢出來的結果放在文件中,在你每次去搜索時是根據條件在文件的基礎上去搜索的,這樣節省時間!
#注意:member_delta 中的sql_query_pre的個數需和member對應,否則可能搜索不出相應的結果
例子:
source main
{
type = mysql #數據庫類型
sql_host = 127.0.0.1 #數據庫ip
sql_user = root #數據庫用戶名
sql_pass = #數據庫密碼
sql_db = ssc #數據庫名
sql_port = 3306 # 數據庫端口

sql_query_pre = SET NAMES utf8
sql_query_pre = REPLACE INTO sphinx_counter SELECT 1, MAX(searchid) FROM search_data

sql_query = SELECT searchid, adddate, siteid, typeid, contentid, data,thumb FROM search_data \
WHERE searchid>=$start AND searchid<=$end
sql_query_range = SELECT 1,max_doc_id FROM sphinx_counter WHERE counter_id=1
sql_range_step = 5000

#字符串屬性設置、需要過濾、排序的時候用到
sql_attr_uint = typeid
sql_attr_uint = siteid
sql_attr_uint = contentid
sql_attr_timestamp = adddate
sql_attr_uint = thumb
sql_query_info = SELECT * FROM search_data WHERE searchid=$id
}

source delta
{
type = mysql #數據庫類型
sql_host = 127.0.0.1 #數據庫ip
sql_user = root #數據庫用戶名
sql_pass = cespc123 #數據庫密碼
sql_db = ssc #數據庫名
sql_port = 3306 # 數據庫端口

sql_query_pre = SET NAMES utf8
sql_query = SELECT searchid, adddate, siteid, typeid, contentid, data,thumb FROM search_data \
WHERE searchid >( SELECT max_doc_id FROM sphinx_counter WHERE counter_id=1 )
sql_query_post = REPLACE INTO sphinx_counter SELECT 1, MAX(searchid) FROM search_data
#字符串屬性設置、需要過濾、排序的時候用到
sql_attr_uint = typeid
sql_attr_uint = siteid
sql_attr_uint = contentid
sql_attr_timestamp = adddate
sql_attr_uint = thumb
sql_query_info = SELECT * FROM search_data WHERE searchid=$id
}

#主索引
index main
{
source = main
# 放索引的目錄
path = /usr/local/sphinx/var/data/ssc
# 編碼
charset_type = utf-8
# 指定utf-8的編碼表
charset_table = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F
# 簡單分詞,只支持0和1,如果要搜索中文,請指定爲1
ngram_len = 1
# 需要分詞的字符,如果要搜索中文,去掉前面的註釋
ngram_chars = U+3000..U+2FA1F
}

#增量索引
index delta
{
source = delta
path = /usr/local/sphinx/var/data/delta
# 編碼
charset_type = utf-8
# 指定utf-8的編碼表
charset_table = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F
# 簡單分詞,只支持0和1,如果要搜索中文,請指定爲1
ngram_len = 1
# 需要分詞的字符,如果要搜索中文,去掉前面的註釋
ngram_chars = U+3000..U+2FA1F
}

indexer
{
mem_limit = 128M
}

searchd
{
port = 9312
log = /usr/local/sphinx/var/log/searchd.log
query_log = /usr/local/sphinx/var/log/query.log
read_timeout = 5
max_children = 30
pid_file = /usr/local/sphinx/var/log/searchd.pid
max_matches = 2000
seamless_rotate = 0
preopen_indexes = 0
unlink_old = 1
compat_sphinxql_magics = 0
}

其實單純的sphinx對中文支持不是很好,推薦使用sphinx-for-chinese

一些鬱悶的錯誤處理

[root@localhost bin]# ./search test1 -c ../etc/sphinx.conf                                        
sphinx-for-chinese 2.1.0-dev (r3361)
Copyright (c) 2008-2012, sphinx-search.com

using config file '../etc/sphinx.conf'...
index 'test1': search error: .

解決辦法:如下標紅的命令後面加參數就可以,-i是指的默認索引

[root@localhost bin]# ./search -i test1 -q 分享身邊的精彩 -c ../etc/sphinx.conf
sphinx-for-chinese 2.1.0-dev (r3361)
Copyright (c) 2008-2012, sphinx-search.com

using config file '../etc/sphinx.conf'...
index 'test1': query '分享身邊的精彩 ': returned 0 matches of 0 total in 0.000 sec

words:
1. '分享': 0 documents, 0 hits
2. '身邊': 0 documents, 0 hits
3. '的': 0 documents, 0 hits
4. '精彩': 0 documents, 0 hits

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章