先当然是从sphnix网站下载sphinx源码包,当前最新版本是:http://www.sphinxsearch.com/downloads/
当然,还需要保证你的系统已经安装了MySQL。
其次,就是依照官方的安装指导进行安装了,基本步骤如下:
官方入门文档 http://www.sphinxsearch.org/archives/80
1、解压sphinx源码包:
mac 版直接解压就能用
http://sphinxsearch.com/files/sphinx-2.2.10-release-osx10.10-x86_64.tar.gz
centos步骤为:
* [root@localhost src]# wget http://www.sphinxsearch.com/downloads/sphinx-0.9.9.tar.gz
* [root@localhost src]# tar zxvf sphinx-0.9.9.tar.gz
* [root@localhost local]# cd sphinx-0.9.9
* [root@localhost sphinx-0.9.9]# ./configure –prefix=/usr/local/sphinx #注意:这里sphinx已经默认支持了mysql
* [root@localhost sphinx-0.9.9]# make && make install # 其中的“警告”可以忽略
2、修改配置文件
* [root@localhost ~]#cd /usr/local/sphinx/etc #进入sphinx的配置文件目录
* [root@localhost etc]# cp sphinx.conf.dist sphinx.conf #新建Sphinx配置文件
* [root@localhost etc]# vim sphinx.conf #编辑sphinx.conf
具体实例配置文件:主要修改mysql 连接信息
source article_src
{
type = mysql #####数据源类型
sql_host = 192.168.1.10 ######mysql主机
sql_user = root ########mysql用户名
sql_pass = pwd############mysql密码
sql_db = test #########mysql数据库名
sql_port= 3306 ###########mysql端口
3、将测试数据导入mysql test 数据库
mysql -uroot -p test < example.sql
4、建立索引文件
[root@localhost sphinx]# bin/indexer -c etc/sphinx.conf ### 建立索引文件的命令
5、运行sphinx
bin/searchd
6、运行php测试
php api/test.php -h localhost
查询结果如下
Query '' retrieved 4 of 4 matches in 0.000 sec.
Query stats:
Matches:
1. doc_id=1, weight=1, group_id=1, date_added=2016-05-18 07:06:30
2. doc_id=2, weight=1, group_id=1, date_added=2016-05-18 07:06:30
3. doc_id=3, weight=1, group_id=2, date_added=2016-05-18 07:06:30
4. doc_id=4, weight=1, group_id=2, date_added=2016-05-18 07:06:30
增量索引 实现近实时更新 .
测试条件:以默认的sphinx.conf配置为例,数据库表的数据也以 example.sql为例。
1.先在mysql中插入一个计数表和两个索引表
CREATE TABLE sph_counter( counter_id INTEGER PRIMARY KEY NOT NULL, max_doc_id INTEGER NOT NULL);
2.修改sphinx.conf
source main_src{
type = mysql
sql_host = localhost
sql_user = yourusername
sql_pass = yourpassword
sql_db = test //你所用的数据库
sql_port = 3306 //所用端口,默认是3306
sql_query_pre = SET NAMES utf8
sql_query_pre = SET SESSION query_cache_type=OFF #下面的语句是更新sph_counter表中的 max_doc_id。 sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(id) FROM documents
sql_query = SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title,
content FROM documents
WHERE id<=( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
}
// 注意:delta_src 中的sql_query_pre的个数需和main_src 对应,否则可能搜索不出相应结果
source delta_src: main_src{
sql_ranged_throttle = 100
sql_query_pre = SET NAMES utf8
sql_query_pre = SET SESSION query_cache_type=OFF
sql_query = SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content FROM documents
WHERE id>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
}
index main //主索引{
source = main_src
path = /path/to/main
# example: /usr/local/sphinx/var/data/main .............
charset_type = utf-8 #这个是支持中文必须要设置的
chinese_dictionary =/usr/local/sphinx/etc/xdict #..........其它可以默认
}
//delta可全部复制主索引,然后更改source 和path如下
index delta: main //增量索引{
source = delta_src
path = /path/to/delta
# example: /usr/local/sphinx/var/data/delta…
}
其它的配置可都用默认的,如果你设置了分布式检索的索引,那么更改下对应的索引名称即可。
3.重新建立索引:
如果sphinx正在运行,那么首先停止运行,然后,根据sphinx.conf配置文件来建立所有索引,最后,启动服务
/usr/local/sphinx/bin/searchd --stop/usr/local/sphinx/bin/indexer -c /usr/local/sphinx/etc/sphinx.conf --all/usr/local/sphinx/bin/searchd -c /usr/local/sphinx/etc/sphinx.conf
P.S /usr/local/sphinx/bin/indexer -c /usr/local/sphinx/etc/sphinx.conf --all --rotate
这样就不需要停searchd,索引后也不再需要重启searchd了。
如果想测试增量索引是否成功,往数据库表中插入数据,查找是否能够检索到,这个时候检索应该为空,然后,单独重建 delta索引
/usr/local/sphinx/bin/indexer -c /usr/lcoal/sphinx/etc/sphinx.conf delta
查看是否将新的记录进行了索引。如果成功,此时,再用 /usr/local/sphing/bin/search 工具来检索,能够看到,在main索引中检索到的结果为0,而在delta中检索到结果。当然,前提条件是,检索的词,只在后来插入的数据中存在。
接下来的问题是如何让增量索引与主索引合并
4.索引合并
合并两个已有索引 有时比 重新索引所有数据有效,虽然,索引合并时,待合并的两个索引都会被读入内存一次,合并后的内容需写入磁盘一次,即,合并100GB和1GB的两个所以,将导致202GB的IO操作
命令原型: indexer --merge DSTINDEX SRCINDEX [--rotate] 将SRCINDEX合并到 DSTINDEX ,所以只有DSTINDEX会改变,如果两个索引都正在提供服务,那么 -- rotate 参数是必须的。例如:将delta合并到main中。
indexer --merge main delta
5.索引自动更新
需要使用到脚本。
建立两个脚本:build_main_index.sh 和 build_delta_index.sh.
build_main_index.sh:
#!/bin/sh
# 停止正在运行的searchd
/usr/local/sphinx/bin/searchd -c /usr/local/sphinx/etc/mersphinx.conf --stop >> /usr/local/sphinx/var/log/sphinx/searchd.log
#建立主索引
/usr/local/sphinx/bin/indexer -c /usr/local/sphinx/etc/mersphinx.conf main >> /usr/local/sphinx/var/log/sphinx/mainindex.log
#启动searchd守护程序
/usr/local/sphinx/bin/searchd >> /usr/local/sphinx/var/log/sphinx/searchd.log
build_delta_index.sh
#!/bin/sh
#停止sphinx服务,将输出重定向
/usr/local/sphinx/bin/searchd –stop >> /usr/local/sphinx/var/log/sphinx/searchd.log
#重新建立索引delta ,将输出重定向
/usr/local/sphinx/bin/indexer delta –c /usr/local/sphinx/etc/sphinx.conf>>/usr/lcoal/sphinx/var/log/sphinx/deltaindex.log
#将delta合并到main中
/usr/local/sphinx/bin/indexer –merge main delta –c /usr/local/sphinx/etc/sphinx.conf >> /usr/lcoal/sphinx/var/log/sphinx/deltaindex.log
#启动服务
/usr/local/sphinx/bin/searchd >> /usr/local/sphinx/var/log/sphinx/searchd.log
脚本写好后,需要编译 chmod +x filename 这样才能运行。即
chmod +x build_main_index.sh
chmod +x build_delta_index.sh
最后,我们需要脚本能够自动运行,以实现,delta索引每5分钟重新建立,和main索引只在午夜2:30时重新建立。
使用crontab 命令 这有俩个地方可作参考 crontab crontab文件
crontab -e 来编辑 crontab文件,如果之前没有使用,会是一个空的文件。写下下面两条语句
*/30 * * * * /bin/sh /usr/local/sphinx/etc/build_delta_index.sh > /dev/null 2>&1
30 2 * * * /bin/sh /usr/local/sphinx/etc/build_main_index.sh > /dev/null 2>&1
第一条是表示每30分钟运行 /usr/local/sphinx/etc/下的build_delta_index.sh 脚本,输出重定向。
第二条是表示 每天的 凌晨2:30分运行 /usr/local/sphinx/etc下的build_main_inde.sh 脚本,输出重定向。
关于前面的 5个值的设置,在上面的crontab文件中有详细的描述。关于重定向的解释,请看最上面的Crontab笔记 ,也有crontab的介绍。
保存好后:重新启动服务
[root@test1 init.d]# service crond stop
[root@test1 init.d]# service crond start
或者
/etc/init.d/crontab start
到现在为止,如果脚本写的没有问题,那么build_delta_index.sh将每30分钟运行一次,而build_main_index.sh将在凌晨2:30分才运行。
要验证的话,在脚本中,有将输出重定向到相关的文件,可以查看下文件中的记录是否增多,也可以看下 /usr/local/sphinx/var/log下的 searchd.log 中,每次重建索引都会有记录。
总结
1.索引合并问题,前面已经解释过,两个索引合并时,都要读入,然后还要写一次硬盘,IO操作量很大。而在php API调用时,Query($query,$index)中$index可以设置多个索引名,如Query($query,"main;delta"),也就没有必要一定将两个索引合并,或者,合并的次数不用那么多。
2.还有一个是没有尝试过的,把增量索引存放到共享内存中(/dev/shm)以提高索引性能,减少系统负荷。关于PHP API
如何能够顺利通过PHP页面来进行检索。
首先,在服务器上searchd 必须是运行的。
然后,根据test.php来修改下。
运行,连接时会出现一个很大的问题 errno =13 permission deny. 最后,查到一个英文的网页,是因为SElinux的原因,关于SELinux在网上能搜到。没有很好的解决办法,只能把SELinux设置为不用。使用的命令有下面两个: setenforce 在 /usr/bin 下
setenforce 1 设置SELinux 成为enforcing模式
setenforce 0 设置SELinux 成为permissive模式