近段时间公司项目的需要,需要对新闻资讯进行全文检索。
新闻资讯总的访问量是日pv1000万,这其中有点水分,有些是爬虫爬的。历史数据量大概是500万+,性能要求支持400个并发请求。页面加载速度需要在1.5秒内加载完毕。
所以针对全文检索这块一开始考虑到使用sphinx或者lucence。最终选择了sphinx,一是它的配置相对来说简单,另外它的效率比较高。但是它对中文的分词支持不太好,google了下,基于sphinx的coreseek和sphinx for chinese在中文检索方面还是不错的。但是coreseek搜索了下,竟然连官网都访问不了了。pass掉。sphinx for chinses的版本又大都是12年的,太旧。最后在github上找到了https://github.com/eric1688/sphinx。这个相对来说是比较新的版本。
1.安装
①cd /usr/local/src
git clone https://github.com/eric1688/sphinx
②cd sphinx
./configure --prefix=/usr/local/sphinx --with-mysql
③make && make install
安装的过程可能会出现以下问题:
* 如果服务器没有事先安装mysql客户端,需要先安装
yum install mysql-devel
然后在执行./configure
* libiconv的问题
这个是源码本身存在的问题,解决
vi src/Makefile
把LIBS = -lexpat -ldl -lm -lz -L/usr/local/lib -lrt -lpthread
改成
LIBS = -lexpat -ldl -lm -lz -liconv -L/usr/local/lib -lrt -lpthread
然后重新make
④安装成功后生成xdict二进制词库。sphinx for chinese使用的分词库是xdict
cd /usr/local/src/sphinx/
/usr/local/sphinx/bin/mkdict xdict_1.1.txt xdict
cp xdict /usr/local/etc/
注意:有时mkdict的时候会出现找不到liconv.so.2
解决:mkdict的时候加ldd ,即ldd /usr/local/sphinx/bin/mkdict xdict_1.1.txt xdict
⑤修改配置文件
cd /usr/local/sphinx/etc/
mv sphinx.conf.dist sphix.conf
关于配置文件的相关参数,我就不做过多描述了。这里有前人写的一篇博客。描述的很详细。
⑥生成索引
/usr/local/sphinx/bin/indexer --all
注:如果在sphinx已经启动的情况下,直接执行上面的命令,会报错如下:
怎么办呢?加一个--rotate参数就可以了。即 /usr/local/sphinx/bin/indexer --all --rotate
⑦启动
/usr/local/sphinx/bin/searchd -c /usr/local/sphinx/etc/sphinx.conf
查看是否启动
ps -ef|grep searchd
⑧cronjob更新索引
sphinx本身不会自动更新索引,所以一旦有新的数据进来或修改原来的数据。怎么办?job定时更新是个选择。但是job更新有个问题,如果你的数据库数据非常庞大,超过1000万,更新索引的话也会比较慢。怎么办?可以通过建立主索引和二级索引的方式。
①mysql里新建一张表,记录上次主索引获取的·最后一个文章的id,比如max_doc_id记录主索引最后一个文章的id,counter_id记录统计的标识id。因为一个配置文件可能会有多个索引,我们需要区别是哪个的max_doc_id。.
②sphinx.conf里配置,主索引获取数据<=counter_id的,二级索引获取数据>counter_id
例如:
主索引数据来源
二级索引数据来源
③创建主索引和二级索引的脚本文件,主索引放到晚上执行,比如1:00,因为数据量大嘛。二级索引可以根据数据增加的情况,设置半个小时或15分钟执行一次。
主索引build_main_index.sh
二级索引build_delta_index.sh
放到job里执行
*/15 * * * * /bin/sh /var/www/html/sphinx_scripts/build_delta_index.sh
30 2 * * * /bin/sh /var/www/html/sphinx_scripts/build_main_index.sh
以上是sphinx for chinese安装和配置,下一篇讲php里如何使用sphinx进行全文检索。