By:0x584A Date:2015年11月24日 00:33:30
原理
首先通过sphinx对数据库里面的数据建立索引文件,通过PHP调用sphinx实例化对象,通过其返回的ID值去查mysql中的数据。
因为ID一般都是设置为主键索引,所以提升了查询效率,一步到位。
环境
操作系统:CentOS 7.0 x64
服务器IP地址:121.42.151.168
Web环境:Nginx+PHP+MySQL
站点根目录:/usr/local/nginx/html
1 CoreSeek下:
wget http://www.coreseek.cn/uploads/csft/3.2/coreseek-3.2.14.tar.gz
2 安装编译工具
yum install make gcc g++ gcc-c++ libtool autoconf automake imake mysql-devel libxml2-devel expat-devel
-
安装mmseg
-
需提前安装操作系统基础开发库及mysql依赖库以支持mysql数据源和xml数据源
$ cd mmseg-3.2.14 $ ./bootstrap #输出的warning信息可以忽略,如果出现error则需要解决 $ ./configure --prefix=/usr/local/mmseg3 $ make && make install $ cd ..
-
安装coreseek
$ cd csft-3.2.14 或者 cd csft-4.0.1 或者 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 ##如果提示mysql问题,可以查看MySQL数据源安装说明 $ make && make install
3 (自信的可以省略这一步)测试mmseg分词,coreseek搜索(需要预先设置好字符集为zh_CN.UTF-8,确保正确显示中文)
$ cd /home/ftp/coreseek-3.2.14/testpack/
$ cat /home/ftp/coreseek-3.2.14/testpack/var/test/test.xml
-
此时应该正确显示中文,如下图所示
$ /usr/local/mmseg3/bin/mmseg -d /usr/local/mmseg3/etc /home/ftp/coreseek-3.2.14/testpack/var/test/test.xml
$ /usr/local/coreseek/bin/indexer -c /home/ftp/coreseek-3.2.14/testpack/etc/csft.conf --all
$ /usr/local/coreseek/bin/search -c /home/ftp/coreseek-3.2.14/testpack/etc/csft.conf 网络搜索
-
启动服务,更新索引
$ /usr/local/coreseek/bin/indexer -c /home/ftp/coreseek-3.2.14/testpack/etc/csft.conf --all --rotate
-
测试MySQL数据源:
测试数据库下载:
http://www.coreseek.cn/uploads/csft/test/documents.sql
上传documents.sql到/home/目录
导入数据库到MySQL从服务器:
mysql -u root -p #进入MySQL控制台
create database documents; #创建数据库
use documents #进入数据库
source /home/documents.sql #导入备份文件到数据库
exit #退出MySQL控制台
-
拷贝MySQL数据源配置文件
$ cp /home/ftp/coreseek-3.2.14/testpack/etc/csft_mysql.conf /usr/local/coreseek/etc/csft_mysql.conf
-
添加软连接
$ ln -s /usr/local/coreseek/etc/csft_mysql.conf /etc/csft_mysql.conf
-
编辑,修改
$ vim /etc/csft_mysql.conf
############################################################################### #MySQL数据源配置,详情请查看:http://www.coreseek.cn/products-install/mysql/ #请先将var/test/documents.sql导入数据库,并配置好以下的MySQL用户密码数据库 #源定义 source mysql { type = mysql sql_host = localhost sql_user = root #账号 sql_pass = 123456 #密码 sql_db = documents #MySQL数据库名称 sql_port = 3306 sql_query_pre = SET NAMES utf8 sql_query = SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content FROM documents #sql_query第一列id需为整数 #title、content作为字符串/文本字段,被全文索引 sql_attr_uint = group_id #从SQL读取到的值必须为整数 sql_attr_timestamp = date_added #从SQL读取到的值必须为整数,作为时间属性 sql_query_info_pre = SET NAMES utf8 #命令行查询时,设置正确的字符集 sql_query_info = SELECT * FROM documents WHERE id=$id #命令行查询时,从数据库读取原始数据信息 } #index定义 index mysql { source = mysql #对应的source名称 path = /usr/local/coreseek/var/data/mysql #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... docinfo = extern mlock = 0 morphology = none min_word_len = 1 html_strip = 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 } #全局index定义 indexer { mem_limit = 1024M #内存使用限制 max_iops = 100 max_iosize = 0 } #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 #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... log =/usr/local/coreseek/var/log/searchd_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... query_log =/usr/local/coreseek/var/log/query_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... } #################################################################################
-
拷贝测试文件到web站点根目录下
$ cp /home/ftp/coreseek-3.2.14/testpack/api/sphinxapi.php /usr/www/coreseek/sphinxapi.php
-
拷贝测试文件到web站点根目录下
$ cp /home/ftp/coreseek-3.2.14/testpack/api/test_coreseek.php /usr/www/coreseek/test_coreseek.php
-
进入web站点根目录
$ cd /usr/www/coreseek
-
编辑,添加以下代码
$ vim test.php
-
建立索引服务
$ /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --all --rotate
-
启动测试模式 运行后会停顿监听 (暂别运行)
$ /usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft_mysql.conf --console
-
后台启动模式
$ /usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft_mysql.conf
-
停止 (用于停止运行在后台服务)
$ /usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft_mysql.conf --stop
-
更新索引服务
$ /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --all --rotate
-
打开浏览器
http://121.42.151.168:81/
-
设置coreseek开机自动后台运行
-
编辑,在最后一行添加下面的代码
vim /etc/rc.d/rc.local
/usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft_mysql.conf -
保存退出
:wq
-
添加以下更新索引脚本
vim /usr/local/coreseek/bin/build_index.sh
#!/bin/sh /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --all --rotate
-
保存退出
:wq
-
添加脚本执行权限
chmod +x /usr/local/coreseek/bin/build_index.sh
-
编辑,在最后一行添加以下代码
vim /etc/crontab
*/30 * * * * root /usr/local/coreseek/bin/build_index.sh #每隔30分钟执行一次
-
保存退出
:wq
-
重新加载任务计划
service crond reload
期间出现的错误
-
[错误1] 到这一步的时候报错:
$/usr/local/coreseek/bin/indexer -c /usr/local/src/coreseek-3.2.14/testpack/etc/csft.conf --all
提示我没有/usr/local/coreseek/bin/indexer 这个目录? cd 看下还真没有. 让后仔细查了下,原来是make出的错。
报错如下:
make[2]: *** [sphinxexpr.o] Error 1 make[2]: Leaving directory `/home/ftp/coreseek-3.2.14/csft-3.2.14/src' make[1]: *** [all] Error 2 make[1]: Leaving directory `/home/ftp/coreseek-3.2.14/csft-3.2.14/src' make: *** [all-recursive] Error 1
解决办法:
编辑 vim ./src/sphinxexpr.cpp
将所有的:
T val = ExprEval ( this->m_pArg, tMatch );
替换成
T val = this->ExprEval ( this->m_pArg, tMatch );
保存然后重新编译就ok了!
-
[错误2] 报错如下:
ERROR: index 'mysql': sql_connect: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) (DSN=mysql://root:***@localhost:3306/coreseek).
解决办法:vim /etc/csft_mysql.conf
加上一句:sql_sock = /tmp/mysql.sock
原文始发于微信公众号(一个人的安全笔记):nginx + PHP 的 sphinx全文索引
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论