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 回复
发表评论