如何使用Sphinx来实现全文检索(搜索)功能
前年(2009)在参与开发CMSTOP系统时,就知道此CMS使用Sphinx实现进行全文检索功能。但那时候自己并没有这功能的开发。不过了解了Sphinx的全文搜索的强大功能。这次,在新的公司,也要做一个全文搜索功能。第一时间就想到了Sphinx来进行功能的实现。
当然在实际上,Sphinx对中文的分词功能并不好。可是很庆幸地是,Coreseek很好地帮我们解决了这一个问题。在这里很感谢此团队为开源事业做出的贡献。Sphinx能得到很多人的认同与用使用,很大一部分功劳和这团队关系。关于此团队更多信息可查看Coreseek首页。
下面我就基本地简介一下如何使用Sphinx来实现全文检索功能,当然大部分安装信息都是在Coreseek主站上直接copy下来,因为他们写的实在太详细了。让我没有任何可发挥的地方。
1.下载Sphinx 支持中文分词Coreseek http://www.coreseek.cn/news/11/52/
2.进行安装:参考http://www.coreseek.cn/products-install/install_on_bsd_linux/
##下载coreseek:coreseek 3.2.14:点击下载、coreseek 4.0.1:点击下载
$ wget http://www.coreseek.cn/uploads/csft/3.2/coreseek-3.2.14.tar.gz $ 或者 http://www.coreseek.cn/uploads/csft/4.0/coreseek-4.0.1-beta.tar.gz $ tar xzvf coreseek-3.2.14.tar.gz 或者 coreseek-4.0.1-beta.tar.gz $ cd coreseek-3.2.14 或者 coreseek-4.0.1-beta
##安装mmseg
$ cd mmseg-3.2.14 $ ./bootstrap #提示中如无error可以不用理会 $ ./configure --prefix=/usr/local/mmseg3 $ make && make install $ cd ..
##安装coreseek,需提前安装mysql依赖库及操作系统基础开发库以支持mysql数据源和xml数据源
$ cd csft-3.2.14 或者 cd csft-4.0.1 $ sh buildconf.sh #提示中如无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 ##如果提示mysql问题,可以查看MySQL数据源安装说明 $ make && make install $ cd ..
##测试mmseg分词,coreseek搜索(需要预先设置好字符集为zh_CN.UTF-8,确保正确显示中文)
$ cd testpack $ cat var/test/test.xml #此时应该正确显示中文 $ /usr/local/mmseg3/bin/mmseg -d /usr/local/mmseg3/etc var/test/test.xml $ /usr/local/coreseek/bin/indexer -c etc/csft.conf --all
3.增加Sphinx增量索引
a.先建立一个计数表
CREATE TABLE sph_counter(
counter_id INTEGER PRIMARY KEY NOT NULL,
max_doc_id INTEGER NOT NULL
);
b.修改sphinx.conf
#主要数据源
source main
{
type = mysql
sql_host = localhost
sql_user = oophp
sql_pass = oophp.cn
sql_db = oophp
sql_port = 3306
sql_query_pre = SET NAMES utf8
sql_query_pre =REPLACE INTO sph_counter SELECT 1, MAX(id) FROM dede_archives
sql_query = Select * From article where channel=3 AND id<=( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
#sql_query第一列id需为整数
#title、content作为字符串/文本字段,被全文索引
#sql_attr_uint =id #从SQL读取到的值必须为整数
#sql_attr_timestamp =pubdata_attr #从SQL读取到的值必须为整数,作为时间属性
sql_query_info_pre = SET NAMES utf8 #命令行查询时,设置正确的字符集
sql_query_info = Select * From article WHERE channel=3 AND id=$id
}
#增量数据源
source delta : main
{
sql_query_pre =SET NAMES utf8
sql_query = Select * From article where channel=3 AND \
id>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
}
#主索引生成
index main
{
source = main #对应的source名称
path = /usr/local/coreseek/data/main/ #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
docinfo = extern
mlock = 0
morphology = none
min_word_len = 1
html_strip = 0
ngram_len=0
#中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/
charset_dictpath = /usr/local/mmseg3/etc/ #BSD、Linux环境下设置,/符号结尾
#charset_dictpath = etc/ #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...
charset_type = zh_cn.utf-8
#charset_type = utf-8
#charset_table = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F
#ngram_chars = U+3000..U+2FA1F
}
#增量索引
index delta : main
{
source = delta #对应的source名称
path = /usr/local/coreseek/data/delta/ #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
}
#全局index定义
indexer
{
mem_limit = 128M
}
#searchd服务定义
searchd
{
listen = 9312
read_timeout = 5
max_children = 30
max_matches = 1000
seamless_rotate = 0
preopen_indexes = 0
unlink_old = 1
pid_file = /var/log/searchd.pid #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
log = /var/log/searchd_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
query_log = /var/log/query_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
binlog_path = #关闭binlog日志
}
c.启动sphinx服务,并生成主索引
#/usr/local/coreseek/bin/searchd # /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/sphinx.conf main --rotate
d.建立生成主索引和增量索引shell脚本
build_main_index.sh脚本: #!/bin/sh #/usr/local/coreseek/bin/searchd --stop /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/sphinx.conf main --rotate build_delta_index.sh脚本: #!/bin/sh #/usr/local/coreseek/bin/searchd --stop /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/sphinx.conf delta --rotate /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/sphinx.conf --merge main delta --merge-dst-range deleted 0 0 --rotate #/usr/local/coreseek/bin/searchd
e.写入cron计划任务中,生成增量索引,并重新建立主索引
//每10分钟生成一次索引 */10 * * * * /bin/sh /usr/local/coreseek/build_delta_index.sh >/dev/null 2>&1 //每天凌晨3点过5分,重新建立一次主索引 5 3 * * * /bin/sh /usr/local/coreseek/build_main_index.sh > /dev/null 2>&1
参考网站:
http://sphinxsearch.com/
http://www.coreseek.cn/
http://www.sphinxsearch.org/archives/category/sphinx
http://blog.c1gstudio.com/archives/730