近段时间公司项目的需要,需要对新闻资讯进行全文检索。

新闻资讯总的访问量是日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

DF显示时不带索引 找不到索引标识怎么办_sphinx

安装的过程可能会出现以下问题:

* 如果服务器没有事先安装mysql客户端,需要先安装

yum install mysql-devel

然后在执行./configure

* libiconv的问题

DF显示时不带索引 找不到索引标识怎么办_DF显示时不带索引_02

这个是源码本身存在的问题,解决

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


DF显示时不带索引 找不到索引标识怎么办_DF显示时不带索引_03



然后重新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已经启动的情况下,直接执行上面的命令,会报错如下:

DF显示时不带索引 找不到索引标识怎么办_DF显示时不带索引_04

怎么办呢?加一个--rotate参数就可以了。即 /usr/local/sphinx/bin/indexer --all --rotate

⑦启动

/usr/local/sphinx/bin/searchd -c /usr/local/sphinx/etc/sphinx.conf

查看是否启动

ps -ef|grep searchd

DF显示时不带索引 找不到索引标识怎么办_sphinx_05

⑧cronjob更新索引

sphinx本身不会自动更新索引,所以一旦有新的数据进来或修改原来的数据。怎么办?job定时更新是个选择。但是job更新有个问题,如果你的数据库数据非常庞大,超过1000万,更新索引的话也会比较慢。怎么办?可以通过建立主索引和二级索引的方式。

①mysql里新建一张表,记录上次主索引获取的·最后一个文章的id,比如max_doc_id记录主索引最后一个文章的id,counter_id记录统计的标识id。因为一个配置文件可能会有多个索引,我们需要区别是哪个的max_doc_id。.

DF显示时不带索引 找不到索引标识怎么办_php_06

②sphinx.conf里配置,主索引获取数据<=counter_id的,二级索引获取数据>counter_id

例如:

主索引数据来源

DF显示时不带索引 找不到索引标识怎么办_php_07

二级索引数据来源

DF显示时不带索引 找不到索引标识怎么办_sphinx_08

③创建主索引和二级索引的脚本文件,主索引放到晚上执行,比如1:00,因为数据量大嘛。二级索引可以根据数据增加的情况,设置半个小时或15分钟执行一次。

主索引build_main_index.sh

DF显示时不带索引 找不到索引标识怎么办_DF显示时不带索引_09

二级索引build_delta_index.sh

DF显示时不带索引 找不到索引标识怎么办_php_10

放到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进行全文检索。