MovableType(以下简称MT)作为一个优秀的博客工具,拥有出色的模板系统和发布静态内容(还有很多很多……)的特点,但是它的搜索一直让人诟病,其主要原因是消耗资源,尤其在虚拟主机、VPS等限制资源的情况下。

因此我很早就抛弃了MT自带的搜索mt-search.cgi,转投Coreseek的怀抱(这期间还测试过Solr这个基于Lucene的大块头,但是后来发现Coreseek小巧灵活容易使用,完全能够满足我的需求,因此选了它)。Coreseek 是一款中文全文检索/搜索软件,以GPLv2许可协议开源发布,基于Sphinx研发并独立发布,专攻中文搜索和信息处理领域,适用于行业/垂直搜索、论坛/站内搜索、数据库搜索、文档/文献检索、信息检索、数据挖掘等应用场景,用户可以免费下载使用。

在这里就不去对比Solr和Coreseek(其实就是Sphinx和Lucene)的性能了。

Coreseek安装(以Debian下安装4.1beta为例)

下载Coreseek安装包

$ wget http://www.coreseek.cn/uploads/csft/4.0/coreseek-4.1-beta.tar.gz
tar -zxf coreseek-4.1-beta.tar.gz
cd coreseek-4.1-beta

貌似需提前安装操作系统基础开发库及mysql依赖库以支持mysql数据源,需要预装的软件列表见《Coreseek 安装测试BSD/Linux系统环境大全》。Debian环境需要安装的包摘录如下:

apt-get install automake libtool gcc g++ make mysql-client libmysqlclient15-dev libxml2-dev libexpat1-dev

安装mmseg

$ cd mmseg-3.2.14
$ ./bootstrap #输出的warning信息可以忽略,如果出现error则需要解决
$ ./configure --prefix=/usr/local/mmseg3
$ make && make install
$ cd ..

安装coreseek

关于MySQL数据源的安装说明见《二、数据源支持:支持MySQL数据源》

$ cd csft-4.1
$ sh buildconf.sh    #输出的warning信息可以忽略,如果出现error则需要解决
$ ./configure --prefix=/usr/local/coreseek  --without-unixodbc --with-mmseg --with-mmseg-includes=/usr/local/mmseg3/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg3/lib/ --with-mysql
$ make && make install
$ cd ..

Coreseek在Debian上的安装就此结束。

Coreseek通用配置

编辑/usr/local/coreseek/etc/csft.conf

indexer:全局index定义

indexer {
mem_limit = 64M
}

searchd:searchd服务定义

searchd {
listen = 9312
read_timeout = 5
max_children = 30
max_matches = 1000
seamless_rotate = 0
preopen_indexes = 0
unlink_old = 1
pid_file = /usr/local/coreseek/var/log/searchd_mysql.pid
log = /usr/local/coreseek/var/log/searchd_mysql.log
query_log = /usr/local/coreseek/var/log/query_mysql.log
}

新增文章索引

source:源定义

source test {
type        = mysql
sql_host    = localhost
sql_user    = username
sql_pass    = password
sql_db      = dbname
sql_port    = 3306
sql_query = SELECT ID,  UNIX_TIMESTAMP(post_date) AS date_added, post_content, post_title FROM wp_posts
sql_attr_timestamp = date_added
sql_query_pre = SET NAMES utf8
sql_query_info_pre = SET NAMES utf8
sql_query_info = SELECT * FROM wp_posts WHERE ID=$ID
}

source的定义是可以继承的,比如使用source test_basic {...}定义了基础的source,再使用source test_advance : test_basic {...}定义新配置或覆盖父配置。

index:索引定义

index test {
source = test
path = /usr/local/coreseek/var/data/test
docinfo = extern
mlock = 0
morphology = none
min_word_len = 1
html_strip = 0
charset_dictpath = /usr/local/mmseg3/etc/
charset_type = zh_cn.utf-8
}

建立索引

建立索引使用indexer。

随便写了一个定义索引的脚本如下:

#!/bin/sh
/usr/local/coreseek/bin/searchd --stop >> /usr/local/coreseek/var/log/searchd.log
echo "Start Indexing..." >> /usr/local/coreseek/var/log/mainindex.log
/usr/local/coreseek/bin/indexer --all >> /usr/local/coreseek/var/log/mainindex.log
echo "Finish..." >> /usr/local/coreseek/var/log/mainindex.log
/usr/local/coreseek/bin/searchd >> /usr/local/coreseek/var/log/searchd.log

搜索服务

启动搜索服务

$ /usr/local/coreseek/bin/searchd

停止搜索服务

$ /usr/local/coreseek/bin/searchd --stop

PHP搜索接口

在Coreseek安装包解压的目录下可以找到testpack/api目录,其中就有PHP搜索的范例。有很多搜索的参数配置详情见《Coreseek 4.1 参考手册》,举几个例子:

// 仅搜索ID为123的作者发布的内容
$cl->SetFilter ( "author_id", array ( 123 ) );
// 仅在id为1,3,7的子论坛中搜索
$cl->SetFilter ( "forum_id", array ( 1,3,7 ) );
// 按照发布时间倒序排列获取的结果
$cl->SetSortMode ( SPH_SORT_ATTR_DESC, "post_date" );
// 匹配查询词中的任意一个
$cl->SetMatchMode ( SPH_MATCH_ANY );

延伸阅读及参考