什么是Coreseek
Sphinx默认不支持中文索引及检索,基于Sphinx开发了Coreseek全文检索服务器,Coreseek应该是现在用的最多的Sphinx中文全文检索,它提供了为Sphinx设计的中文分词包LibMMSeg包含mmseg中文分词。
安装
--解压安装包 # tar -zxvf coreseek-3.2.14.tar.gz # ls csft-3.2.14 mmseg-3.2.14 README.txt testpack
安装中文分词mmseg
# cd mmseg-3.2.14/ # ./configure --prefix=/usr/local/mmseg --编译报错 config.status: error: cannot find input file: src/Makefile.in --运行下面指令再次编译就能通过了 # automake # make && make install --运行mmseg,输出安装信息则mmseg中文分词已经安装好了 # /usr/local/mmseg/bin/mmseg Coreseek COS(tm) MM Segment 1.0 Copyright By Coreseek.com All Right Reserved. Usage: /usr/local/mmseg/bin/mmseg <option> <file> ...
安装csft即sphinx
# cd 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
配置带有中文分词的sphinx配置文件
配置文件和配置sphinx步骤一样,只不过是在coreseek中,有几个地方要注意。
注意:coreseek中配置文件是csft.conf,而不是sphinx.conf
# cd /usr/local/coreseek/etc # cp sphinx.conf.dist csft.conf --修改配置文件 # vi csft.conf --主数据源 source main{ sql_host = localhost sql_user = root sql_pass =root sql_db = test sql_port = 3306 # optional, default is 3306 sql_sock = /tmp/mysql.sock sql_query_pre = SET NAMES utf8 sql_query_pre = SET SESSION query_cache_type=OFF sql_query=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 } --增量数据源注释(255,257s/^/#/g) --主数据源索引 index main{ source = main path = /usr/local/coreseek/var/data/main #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/ --添加词典路径 } --增量数据源索引注释(481,485s/^/#/g) --分布式索引注释(492,523s/^/#/g) --索引器 indexer{ mem_limit = 128M } :wq --保存退出
生成索引并测试
--创建索引 # /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf --all --或者(/usr/local/coreseek/bin) [root@localhost bin]# ./indexer --all
注意:如果你设置的coreseek配置文件为csft.conf,则index、search和searchd时不用带上-c /usr/local/soreseek/etc/csft.conf,因为默认就是去寻找这个文件
至此,中文分词已经安装完成了,并测试成功。
使用PHP去使用Sphinx技术
Sphinx集成到PHP程序中,有两种方式:
1.Sphinx php模块
2.Sphinxapi类
使用Sphinx需要以下几件事
1、首先得有数据
2、建立Sphinx配置文件
3、生成索引
4、启动Searchd服务进程,并开放端口9312
5、用PHP客户端程序去连接Sphinx服务
一、启动sphinx服务
想要在程序中使用sphinx必须开启Sphinx服务
启动进程命令:searchd
-c #指定配置文件(如果是默认配置文件命名,则可以省略) --stop #停止服务 --pidfile #用来显示指定一个PID文件 -p #指定端口
# /usr/local/coreseek/bin/searchd
注意:这里启动的服务是searchd,不是search,Sphinx默认端口是9312
二、用PHP连接使用Sphinx程序
(1)PHP加载Sphinx模块
# tar -zxvf sphinx-1.1.0.tgz # cd sphinx-1.1.0 [root@localhost sphinx-1.1.0]# /usr/local/php/bin/phpize --生成脚本 --编译安装 # ./configure --with-php-config=/usr/local/php/bin/php-config --with-sphinx -----------------------------报错-------------------------------------- configure: error: Cannot find libsphinxclient headers -----------------------------解决方法---------------------------------- 在之前的coreseek安装包中(/root/coreseek-3.2.14/csft-3.2.14/api/libsphinxclient) [root@localhost api]# cd libsphinxclient/ [root@localhost libsphinxclient]# ./configure [root@localhost libsphinxclient]# make && make install 安装完后,继续安装sphinx拓展 ------------------------------------------------------------------------- # /usr/local/php/bin/phpize # ./configure --with-php-config=/usr/local/php/bin/php-config --with-sphinx # make && make install # cd /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/ # cp ./sphinx.so /usr/local/php/ext/ --修改php配置文件 extension=sphinx.so --添加 --重启apache # /usr/local/apache2/bin/apachectl restart --查看phpinfo,如果有sphinx模块,则说明加载模块成功
安装samba服务器实现文件共享
# yum -y install samba* --skip-broken --编辑配置文件 # vi /etc/samba/smb.conf [web] path = /usr/local/apache2/htdocs browseable = yes writable = yes :wq --保存退出 --启动服务 # service smb restart --保证下次自动启动 # chkconfig smb on --关闭245运行级别下启动 # chkconfig --level 245 smb off --创建用户 useradd apache smbpasswd -a apache
windows中输入地址\\192.168.10.130\web,也可映射成网络磁盘,即可访问web目录。
--使apache用户有创建目录和文件的权限,这样所有者和所属组都是apache,有问题 setfacl -m u:apache:rwx -R htdocs/ setfacl -m d:u:apache:rwx -R htdocs/ --编辑apache配置文件,改变apache的执行者 User apache Group apache --重启apache # /usr/local/apache2/bin/apachectl restart --此时apache进程的执行者是apache了,不是deamon
php测试脚本
<html> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <title>查询</title> <body> <h1>查询页面</h1> <form action="find.php" method="post"> 请输入查询关键字 <input type="text" name="word" style="width:200px;"/><br/> <input type="submit" value="提交查询"/> </form> </body> </html>
<html> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <title>Find</title> <body> <h1>查询输出页面</h1> <?php $keyword = $_POST['word']; $sphinx = new SphinxClient(); $sphinx->SetServer("localhost",9312); $sphinx->SetMatchMode(SPH_MATCH_ANY); //匹配模式 $result = $sphinx->query("$keyword","*"); /*print_r($result);*/ $ids = implode(',', array_keys($result['matches'])); //取出文档id mysql_connect("localhost","root","root"); mysql_select_db("test"); mysql_query("set names utf8"); $sql ="select * from post where id in ({$ids})"; $res = mysql_query($sql); $opts=array( "before_match"=>"<font style='font-weight:bold;color:red'>", "after_match"=>"</font>" ); while($row = mysql_fetch_assoc($res)){ $res2 = $sphinx->buildExcerpts($row,"main",$keyword,$opts); echo "标题:{$res2[1]}<br/>"; echo "内容:{$res2[2]}<br/>"; echo "<br/>"; } ?> </body> </html>
Sphinx实时索引
数据中的数据很大,然后我有些新数据后来加入到数据中,也希望能够检索到,全部重新建立索引很消耗资源,这样需要用到“主索引+增量索引”的思路来解决,这个模式实现的基本原理是设置两个数据源和两个索引。
1、创建一个计数器
一个简单的实现是,在数据库中增加一个计数器,记录将文档集分为两个部分的文档ID,每次重新构建主索引时,更新这个表。
现在mysql中插入一个计数表
CREATE TABLE sph_counter( counter_id int not null primary key, max_doc_Id int not null );
2、再次修改配置文件
主数据源,增量数据源,主索引,增量索引。
主数据源里面:我们需要把预查询语句改成下面的语句
vi /usr/local/coreseek/etc/csft.conf
--主数据源 source main { 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 delta : main { sql_query_pre=set names utf8 sql_query=select id,title,content from post where id > (select max_doc_id from sph_counter where counter_id=1) } --主索引(不用变) --增量索引 index delta : main { source = delta path = /usr/local/coreseek/var/data/delta #morphology = stem_en }
--生成增量索引 [root@localhost bin]# ./indexer delta --rotate
crontab计划任务脚本定时更新索引
[root@localhost bin]# cd /usr/local/coreseek/ --创建脚本执行日志文件 [root@localhost coreseek]# cd var/log/ [root@localhost log]# touch main.log [root@localhost log]# touch delta.log [root@localhost log]# ls delta.log main.log query.log searchd.log searchd.pid --创建存放脚本文件夹和文件 [root@localhost coreseek]# mkdir init [root@localhost init]# touch main.sh [root@localhost init]# touch delta.sh [root@localhost init]# ls delta.sh main.sh [root@localhost init]# vi main.sh ------------------------------main.sh-------------------------------------- #!/bin/bash #main.sh /usr/local/coreseek/bin/indexer main --rorate >>/usr/local/coreseek/var/log/main.log ------------------------------------------------------------------------------ [root@localhost init]# vi delta.sh ------------------------------delta.sh-------------------------------------- #!/bin/bash #delta.sh /usr/local/coreseek/bin/indexer delta --rorate >>/usr/local/coreseek/var/log/delta.log ------------------------------------------------------------------------------
最后,我们需要脚本能够自动运行,以实现增量索引每5分钟重新建立,和主索引只在凌晨2:30时重新建立。
[root@localhost init]# crontab -e */5 * * * * /usr/local/coreseek/init/delta.sh --每5分钟执行一次增量索引 30 2 * * * /usr/local/coreseek/init/main.sh --每天凌晨建立主索引 --加脚本的执行权限 [root@localhost init]# chmod a+x * --计划任务已启动 [root@localhost init]# crontab -l */5 * * * * /usr/local/coreseek/init/delta.sh 00 03 * * * /usr/local/coreseek/init/main.sh
分布式索引
分布式是为了改善查询延迟问题和提高多服务器、多CPU 或多核环境下的吞吐率,对于大量数据(即十亿级的记录数和TB级的文本量)上的搜索应用来说是很关键的。
分布式思想:对数据进行水平分区(HP,Horizontally partition),然后并行处理,当searched收到一个对分布式索引的查询时,它做如下操作
1.连接到远程代理
2.执行查询
3.对本地索引进行查询
4.接收来自远程代理的搜索结果
5.将所有结果合并,删除重复项
6.将合并后的结果返回给客户端
index dist { type=distributed local=chunk1 agent=localhost:9312:chunk2 本地 agent=192.168.100.2:9312:chunk3 远程 agent=192.168.100.2:9312:chunk4 远程 }
来源:https://www.cnblogs.com/gimin/p/5598651.html