sphinx是一個全文檢索引擎,coreseek則是基於sphinx開發的、增加了中文分詞功能的搜索引擎。最新版本的sphinx是免安裝的,只需要到 sphinx官網 下載相應版本的文件即可。而coreseek的版本較舊,因此安裝稍微複雜一些,在此做一下記錄。
目錄介紹
- 安裝目錄:
/usr/local/coreseek
- 索引存放目錄:
/home/coreseek/data
- 日誌存放目錄:
/home/coreseek/log
安裝mmseg
在mmseg目錄下,運行以下命令
./configure --prefix=/usr/local/mmseg
make && make install
安裝csft
在csft目錄下,運行以下命令
./configure --prefix=/usr/local/coreseek --with-mmseg=/usr/local/mmseg --with-mmseg-includes=/usr/local/mmseg/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg/lib/
make && make install
編輯csft.conf文件
進入/usr/local/coreseek/etc
目錄下,新建csft.conf文件(文件名可以隨意起)並打開。下面給出一個可運行的最小文件配置。
source src1
{
type = mysql
sql_host = mysql的ip地址
sql_user = root
sql_pass = root
sql_db = 數據庫名稱
sql_port = 3306
sql_query_pre = SET NAMES utf8
sql_query = SELECT id, content FROM table1 # sql查詢語句
}
index src1
{
source = src1
path = /home/coreseek/data/src1 # 存放該索引的位置
docinfo = extern
mlock = 0
morphology = none
min_word_len = 1
html_strip = 0
charset_dictpath = /usr/local/mmseg/etc/
charset_type = zh_cn.utf-8
}
indexer
{
mem_limit = 128M
}
searchd
{
listen = 9312
read_timeout = 5
max_children = 30
max_matches = 1000
pid_file = /home/coreseek/log/searchd.pid # pid文件位置
log = /home/coreseek/log/searchd.log # searchd服務的日誌位置
query_log = /home/coreseek/log/query.log # 記錄查詢內容日誌的位置
}
生成全部索引
在/usr/local/coreseek/bin
目錄下,運行命令./indexer -c ../etc/csft.conf --all
建立所有索引。
啓動coreseek搜索進程
進入/usr/local/coreseek/bin
目錄,運行命令./searchd -c ../etc/csft.conf
啓動coreseek搜索進程。
增量索引
如果數據庫中數據是不斷增長的,每次重建所有索引會比較耗時,因此可以採用增量索引+定期重建全部索引的方式來維護索引。增量索引的基本思想如下:
新建一個數據表sph_counter
,用來維護主索引和增量索引的界限。主索引每次建立的時候,更新數據表中的max_doc_id
,然後重建id
小於max_doc_id
的數據索引(即全部數據的索引);增量索引每次建立的時候,建立id
大於max_doc_id
的數據索引,然後更新max_doc_id
。更新索引使用定時任務crontab
完成。主索引每天更新一次,增量索引時間可以設短一點。在查詢內容的時候,在全部索引中查詢。
數據表sph_counter
的建表語句如下:
CREATE TABLE `sph_counter` (
`counter_id` int(1) NOT NULL COMMENT '標識不同的數據表',
`max_doc_id` bigint(21) NOT NULL COMMENT '每個索引表的最大ID,會實時更新',
PRIMARY KEY (`counter_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
csft.conf文件配置的部分內容如下所示:
source src_main
{
……省略
sql_query_pre = REPLACE INTO sph_counter SELECT 1,MAX(id) FROM table1
sql_query = SELECT id, content FROM table1 where \
id <= (SELECT max_doc_id FROM sph_counter WHERE counter_id = 1)
}
source src_delta:src_main
{
sql_query_pre =
sql_query = SELECT id, content FROM table1 where \
id > (SELECT max_doc_id FROM sph_counter WHERE counter_id = 1)
sql_query_post = UPDATE sph_counter \
SET max_doc_id = (SELECT MAX(id) FROM table1) WHERE counter_id = 1
}
index src_main
{
source = src_main
path = /home/sphinx/data/src_main
}
index src_delta:src_main
{
source = src_delta
path = /home/sphinx/data/src_delta
}
……省略
命令彙總
以下命令均在/usr/local/coreseek/bin
目錄下。
- 啓動搜索進程:
./searchd -c ../etc/csft.conf
- 關閉搜索進程:
./searchd -c ../etc/csft.conf --stop
- 生成全部索引:
./indexer -c ../etc/csft.conf --all --rotate
(如果searchd進程未運行,則不用加–rotate參數) - 生成特定索引:
./indexer -c ../etc/csft.conf 索引名 --rotate
(如果searchd進程未運行,則不用加–rotate參數)