網上配置文檔眾多,但是對著他們的文檔來做老是出問題,于是花了點時間研究了一下,寫成總結,方便以后查閱。也希望學習sphinx的朋友能少走彎路。Coreseek的安裝請參考: http://blog.chinaunix.net/uid-20639775-id-3261834.html 。
一、sphinx的配置
- sphinx配置文件結構介紹
Sphinx的配置文件結構如下:
Source?源名稱1{?????
#添加數據源,這里會設置一些連接數據庫的參數比如數據庫的IP、用戶名、密碼等
#設置sql_query、設置sql_query_pre、設置sql_query_range等后面會結合例子做詳細介紹
?……
}
Index?索引名稱1{
???? Source=源名稱1
#設置全文索引
?????……
}
Indexer{
#設置Indexer程序配置選項,如內存限制等
……
}
Searchd{??
#設置Searchd守護進程本身的一些參數
……
}
Source和Index都可以配置多個。
?
- spinx配置案例詳細解釋
接下來就來針對一個配置案例來做詳細的配置介紹:
#定義一個數據源
source search_main
{
???????????#定義數據庫類型
????type?????????????????= mysql
???????????#定義數據庫的IP或者計算機名
????sql_host?????????????= localhost
???????????#定義連接數據庫的帳號
????sql_user?????????????= root
???????????#定義鏈接數據庫的密碼
????sql_pass?????????????= test123
???????????#定義數據庫名稱
????sql_db???????????????= test
???????????#定義連接數據庫后取數據之前執行的SQL語句
????sql_query_pre????????= SET NAMES utf8
????sql_query_pre????????= SET SESSION query_cache_type=OFF
???????????#創建一個sph_counter用于增量索引
????sql_query_pre????????= CREATE TABLE IF NOT EXISTS sph_counter \
??????????????????????????????????????( counter_id INTEGER PRIMARY KEY NOT NULL,max_doc_id INTEGER NOT NULL)
???????????#取數據之前將表的最大id記錄到sph_counter表中
????sql_query_pre????????= REPLACE INTO sph_counter SELECT 1, MAX(searchid) FROM v9_search
???????????#定義取數據的SQL,第一列ID列必須為唯一的正整數值
????sql_query????????????= SELECT searchid,typeid,id,adddate,data FROM v9_search where \
??????????????????????????????????????searchid<( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 ) \
????????????????????????????????????????and searchid>=$start AND searchid<=$end
???????????# sql_attr_uint和sql_attr_timestamp用于定義用于api過濾或者排序,寫多行制定多列
????sql_attr_uint????????= typeid
????sql_attr_uint????????= id
????sql_attr_timestamp???= adddate
???????????#分區查詢設置
????sql_query_range??????= SELECT MIN(searchid),MAX(searchid) FROM v9_search
???????????#分區查詢的步長
????sql_range_step???????= 1000
???????????#設置分區查詢的時間間隔
????sql_ranged_throttle??= 0
???????????#用于CLI的調試
????sql_query_info???????= SELECT * FROM v9_search WHERE searchid=$id
}
#定義一個增量的源
source search_main_delta : search_main
{
????sql_query_pre???????= set names utf8
???????????#增量源只查詢上次主索引生成后新增加的數據
#如果新增加的searchid比主索引建立時的searchid還小那么會漏掉
????sql_query???????????= SELECT searchid,typeid,id,adddate,data FROM v9_search where??\
??????????????????????????????????searchid>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 ) \
???????????????????????????????????and searchid>=$start AND searchid<=$end
????sql_query_range?????= SELECT MIN(searchid),MAX(searchid) FROM v9_search where \
???????????????????????????????????????searchid>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
}
?
#定義一個index_search_main索引
index index_search_main
{
???????????#設置索引的源
????source????????????= search_main
???????????#設置生成的索引存放路徑
????path?????????= /usr/local/coreseek/var/data/index_search_main
???????????#定義文檔信息的存儲模式,extern表示文檔信息和文檔id分開存儲
????docinfo???????????= extern
???????????#設置已緩存數據的內存鎖定,為0表示不鎖定
????mlock?????????????= 0
???????????#設置詞形處理器列表,設置為none表示不使用任何詞形處理器
????morphology????????= none
???????????#定義最小索引詞的長度
????min_word_len??????= 1
???????????#設置字符集編碼類型,我這里采用的utf8編碼和數據庫的一致
????charset_type??????= zh_cn.utf-8
???????????#指定分詞讀取詞典文件的位置
????charset_dictpath??= /usr/local/mmseg3/etc
???????????#不被搜索的詞文件里表。
????stopwords???????= /usr/local/coreseek/var/data/stopwords.txt
???????????#定義是否從輸入全文數據中取出HTML標記
????html_strip???????= 0
}
#定義增量索引
index index_search_main_delta : index_search_main
{
????source???= search_main_delta
????path????= /usr/local/coreseek/var/data/index_search_main_delta
}
?
#定義indexer配置選項
indexer
{
???????????#定義生成索引過程使用索引的限制
????mem_limit????????= 512M
}
?
#定義searchd守護進程的相關選項
searchd
{
???????????#定義監聽的IP和端口
????#listen????????????= 127.0.0.1
????#listen????????????= 172.16.88.100:3312
????listen????????????= 3312
????listen????????????= /var/run/searchd.sock
???????????#定義log的位置
????log????????????????= /usr/local/coreseek/var/log/searchd.log
???????????#定義查詢log的位置
????query_log??????????= /usr/local/coreseek/var/log/query.log
???????????#定義網絡客戶端請求的讀超時時間
????read_timeout???????= 5
???????????#定義子進程的最大數量
????max_children???????= 300
???????????#設置searchd進程pid文件名
????pid_file???????????= /usr/local/coreseek/var/log/searchd.pid
???????????#定義守護進程在內存中為每個索引所保持并返回給客戶端的匹配數目的最大值
????max_matches????????= 100000
???????????#啟用無縫seamless輪轉,防止searchd輪轉在需要預取大量數據的索引時停止響應
????#也就是說在任何時刻查詢都可用,或者使用舊索引,或者使用新索引
????seamless_rotate????= 1
???????????#配置在啟動時強制重新打開所有索引文件
????preopen_indexes????= 1
???????????#設置索引輪轉成功以后刪除以.old為擴展名的索引拷貝
????unlink_old?????????= 1
???????????#?MVA更新池大小,這個參數不太明白
????mva_updates_pool???= 1M
???????????#最大允許的包大小
????max_packet_size????= 32M
???????????#最大允許的過濾器數
????max_filters????????= 256
???????????#每個過濾器最大允許的值的個數
????max_filter_values??= 4096
}
?
二、sphinx的管理
- 生成Sphinx中文分詞詞庫(新版本的中文分詞庫已經生成在了/usr/local/mmseg3/etc目錄下)
cd /usr/local/mmseg3/etc
/usr/local/mmseg3/bin/mmseg -u thesaurus.txt
mv thesaurus.txt.uni uni.lib
- 生成Sphinx中文同義詞庫
#同義詞庫是說比如你搜索深圳的時候,含有深圳灣等字的也會被搜索出來
/data/software/sphinx/coreseek-3.2.14/mmseg-3.2.14/script/build_thesaurus.py unigram.txt > thesaurus.txt
/usr/local/mmseg3/bin/mmseg -t thesaurus.txt
將thesaurus.lib放到uni.lib同一目錄
- 生成全部索引
/usr/local/coreseek/bin/indexer --config /usr/local/coreseek/etc/sphinx.conf –all
若此時searchd守護進程已經啟動,那么需要加上—rotate參數:
/usr/local/coreseek/bin/indexer --config /usr/local/coreseek/etc/sphinx.conf --all --rotate
- 啟動searchd守護進程
/usr/local/coreseek/bin/searchd --config /usr/local/coreseek/etc/sphinx.conf
- 生成主索引
寫成shell腳本,添加到crontab任務,設置成每天凌晨1點的時候重建主索引
/usr/local/coreseek/bin/indexer --config /usr/local/coreseek/etc/sphinx.conf --rotate index_search_main
- 生成增量索引
寫成shell腳本,添加到crontab任務,設置成每10分鐘運行一次
/usr/local/coreseek/bin/indexer --config /usr/local/coreseek/etc/sphinx.conf --rotate index_search_main_delta
- 增量索引和主索引的合并
寫成shell腳本,添加到計劃任務,每15分鐘跑一次
/usr/local/coreseek/bin/indexer --config /usr/local/coreseek/etc/sphinx.conf --merge index_search_main index_search_main_delta --rotate
- 使用search命令在命令行對索引進行檢索
/usr/local/coreseek/bin/search --config /usr/local/coreseek/etc/sphinx.conf??游戲
?
?
三、參考文章鏈接:
http://baobeituping.iteye.com/blog/870354
http://www.sphinxsearch.org/sphinx-tutorial
http://blog.s135.com/post/360/
http://youngerblue.iteye.com/blog/1513140
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
