Coreseek介绍:Sphinx默认不支持中文索引及检索,基于Sphinx开发了Coreseek 全文检索服务器,Coreseek应该是现在用的最多的Sphinx中文全文检索,它提供了为Sphinx设计的中文分词包LibMMSeg包含mmseg中文分词
1、首先现在并且安装coreseek安装包
(1)、下载中文分词包http://www.coreseek.cn 到官网去下载Coreseek相应的版本
(2)、解压安装
#cd /lamp #tar -zxvf coreseek-3.2.14.tar.gz //进入到mmseg所在文件夹,先安装中文分词mmseg #cd /lamp/coreseek-3.2.14/mmseg-3.2.14/ #./configure --prefix=/usr/local/mmseg
编译过程中报了一个config.status: error: cannot find input file: src/Makefile.in
这个的错误,然后运行下列指令再次编译就能通过了:
//真正的解决办法 #aclocal #libtoolize --force #automake --add-missing #autoconf #autoheader #make clean
#automake
#./configure --prefix=/usr/local/mmseg #make && make install
然后运行mmseg,就能输入安装成功的信息了:
#/usr/local/mmseg/bin/mmseg出现下列信息,就证明mmseg中文分词已经安装好了。
2、接下来,我们要把Sphinx和mmseg结合起来 , 并且配置好配置文件
(1)、检测安装
进入coreseek目录,进行安装
#cd /lamp/coreseek-3.2.14/csft-3.2.14/ #./configure --prefix=/usr/local/coreseek --with-mysql=/usr/local/mysql --with-mmseg=/usr/local/mmseg --with-mmseg-includes=/usr/local/mmseg/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg/lib/ #make && make install
(2)、配置带有中文分词的sphinx配置文件
配置文件和上面的步骤一样,只不过是在coreseek中,有几个地方需要注意。
注意:coreseek中得配置文件也是csft.conf,而不是sphinx.conf
#cd /usr/local/coreseek/etc #cp sphinx.conf.dist csft.conf
配置csft.conf , 配置过程中 ,没提到的东西默认 , 提到的但是不存在的则追加
#vim csft.conf
#主数据源 source src1 { type = mysql #数据库类型 sql_host = localhost # MySQL主机IP sql_user = root # MySQL用户名 sql_pass = 123 # MySQL密码 sql_db = test # MySQL数据库 sql_port = 3306 # MySQL端口 sql_sock = /tmp/mysql.sock #如果是linux下需要开启,指定sock文件 sql_query_pre = SET NAMES UTF8 # MySQL检索编码 sql_query = \ #获取数据的SQL语句 SELECT id, title, content FROM post #sql_attr_uint = group_id #对排序字段进行注释 #sql_attr_timestamp = date_added #对排序字段进行注释 sql_query_info= SELECT * FROM post WHERE id=$id #这里这一句是用来添加查询的属性的 , 可以通过php的操作函数 #UpdateAttributes对查询数据进行更新 sql_attr_multi = uint status from field status; } #这行暂时不需要修改 source srclthrottled:srcl #继承主数据源 #主数据源索引: index test1 { source = src1 #索引源声明 #stopwords = G:\data\stopwords.txt #wordforms = G:\data\wordforms.txt #exceptions = /data/exceptions.txt #添加下面这两行,意思是把中文分词加入到配置文件中 charset_type = zh_cn.utf-8 charset_dictpath = /usr/local/mmseg/etc/ #你安装mmseg的目录 } #增量索引 #index testlstemmed:test1 #先进行注释 #index distl #分布式也注释掉
(3)、生成索引并且测试
#/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf “test1” //测试 #/usr/local/coreseek/bin/search -c /usr/local/coreseek/etc/csft.conf “测试查询内容”
#/usr/local/coreseek/bin/indexer -c etc/csft.conf --all错误信息 :/usr/local/coreseek/bin/indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory
解决办法 :
#vim /etc/ld.so.conf #加入内容 /usr/local/mysql/lib #ldconfig-v
3、建立sphinx实施索引(包含增量索引)
数据库中的数据很大,然后我有些新的数据后来加入到数据库中,也希望能够检索到,全部重新建立索引很消耗资源,这样需要用到“主索引+增量索引”的思路来解决,这个模式实现的基本原理是设置两个数据源和两个索引。
(1)、创建一个计数器
一个简单的实现是,在数据库中增加一个计数表,记录将文档集分为两个部分的文档 ID,每次重新构建主索引时,更新这个表
先在 mysql 中插入一个计数表
mysql> CREATE TABLE sph_counter( counter_id INTEGER PRIMARY KEY NOT NULL, max_doc_id INTEGER NOT NULL); //插入一条数据 mysql>INSERT INTO sph_counter (`id`, ` max_doc_id `) VALUES ('1', '0');
(2)、再次修改配置文件
主数据源,继承数据源,主索引,继承索引。(继承索引也就是增量索引)。
主数据源里面:我们需要把欲查询语句改成下面的语句:
#vi /usr/local/coreseek/etc/csft.conf
Source src1{ #添加一句sql_query_pre , 并且修改sql_query #这里的sql_query_pre是每一次更新的时候时都同时更新计时器 sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(id) FROM post #这里是读取在计时器之前更新的数据 , 也是老数据 sql_query= \ SELECT id,title, content FROM post \ WHERE id<=(SELECT max_doc_id FROM sph_counter WHERE counter_id=1) } #继承数据源: source src1Add : src1 { sql_query_pre = SET NAMES utf8 #这里一上面数据源的相反 , 主要是读取新数据,也是增量数据,所以id是取大于计时器的 sql_query = \ SELECT id,title, content FROM post \ WHERE id>(SELECT max_doc_id FROM sph_counter WHERE counter_id=1) } #主索引: Index test1 { source = src1 path = /usr/local/coreseek/var/data/src1 } #继承索引(也是增量索引) index test1Add:test1 { source= src1Add path= /usr/local/coreseek/var/data/test1Add }剩下的基本不用改变
注意:如果你增量索引的 source 配置中只有 id,content 三项而主索引的 source 配置中有 id, title,content 四项,合并的时候会报属性数量不匹配,如:
Delta:sql_query = SELECT id, title,content FROM post
Main:sql_query=SELECT id,title,date,content FROM post
(3)、测试增量索引+主索引
//如果想测试增量索引是否成功,往数据库表中插入数据,查找是否能够检索到,这个时候检索应该为空,然后,单独重建增量索引 //先把新插入的数据添加到增量索引中 #/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf test1Add //查看新的数据是否已经在增量索引中 #/usr/local/coreseek/bin/search -c /usr/local/coreseek/etc/csft.conf “查询数据” //将增量索引更新到主索引中 #/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf test1 //查看新的数据是否已经在主索引中 #/usr/local/coreseek/bin/search -c /usr/local/coreseek/etc/csft.conf “查询数据” //如果成功此时,再用/usr/local/coreseek/bin/search 工具来检索,能够看到,在主索引中检索到的结果为 0,而在增量中检索到结果。当然,前提条件是,检索的词,只在后来插入的数据中存在
(4)、实时更新索引
我们需要建立两个脚本,还要用到计划任务
建立一个主索引和增量索引的脚本
test1.sh //更新主索引脚本
test1Add.sh //更新增量索引脚本
在增量索引中写下test1Add.sh#cd /usr/local/coreseek/etc #vim test1Add.sh
#!/bin/bash /usr/local/coreseek/bin/indexer test1Add -c /usr/local/coreseek /dict/csft_mysql.conf >>/usr/local/coreseek/var/log/test1Add.log --rotate
主索引中写下:test1.sh意思就是合并索引
#vim test1.sh
#!/bin/bash /usr/local/coreseek/bin/indexer --merge -c /usr/local/coreseek/dict/csft_mysql.conf >>/usr/local/coreseek/var/log/test1.log --rotate
编写好了之后 ,更改脚本权限:
#chmod a+x test1Add.sh #chmod a+x test1.sh
最后,我们需要脚本能够自动运行,以实现增量索引每5分钟重新建立,和主索引只在凌晨2:30时重新建立.
脚本写好了,我们需要建立计划任务
#crontab -e */5 * * * * /usr/local/coreseek/etc/test1Add.sh 30 2 * * * /usr/local/coreseek/etc/test1.sh
第一条是表示每5分钟运行
第二条是表示每天的凌晨2:30分运行
要验证的话,我们可以查看日志文件4、最终要开启php的话需要开启searchd服务 , 监听的端口是9312
#/usr/local/coreseek/bin/searchd –c /usr/local/coreseek/etc/csft.conf
版权声明:未经博主允许不得转载。http://smister.com/post-9.html
好好学习努力工作的王小二 :
2016-04-28 14:45:01 回复
hongsehaiyan :
2015-03-18 14:53:08 回复
发表评论