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参数)