Coreseek介绍:
Sphinx默认不支持中文索引及检索,基于Sphinx开发了Coreseek 全文检索服务器,Coreseek应该是现在用的最多的Sphinx中文全文检索,它提供了为Sphinx设计的中文分词包LibMMSeg包含mmseg中文分词
引言:coreseek 3.2 稳定版
1、先安装环境:
yum install make gcc gcc++ gcc-c++ libtool autoconf automake imake mysql-devel libxml2-devel
expat-devel
注: 检测以上软件是否安装,如果没有请确保安装;否则无法正常安装Coreseek-3.2.14
2、开始安装:
#把安装包放到此处
cd /usr/local/src
#下载CoreSeek
wget http://www.coreseek.cn/uploads/csft/3.2/coreseek-3.2.14.tar.gz
这里注意一下,这个路径现在暂时已经用不了(至少我写这篇博客的时候用不了),但是毕竟这是官网,还是要放一下的。大家去网上搜索下载到本地,然后再用 Filezilla
等软件上传到服务器即可。
#解压出来的文件夹
tar -zxvf coreseek-3.2.14.tar.gz
cd coreseek-3.2.14
##############安装 mmseg #################
cd mmseg-3.2.14
./bootstrap #输出的warning信息可以忽略,如果出现error则需要解决,一般不会出现错误
#指定 mmseg 的安装目录
./configure --prefix=/usr/local/mmseg
make && make install
然后运行mmseg,就能输入安装成功的信息了:
/usr/local/mmseg/bin/mmseg
出现下列信息,就证明mmseg中文分词已经安装好了。
接下来,我们要把Sphinx和mmseg结合起来
#############安装 csft-3.2.14 ###############
cd /usr/local/src/coreseek-3.2.14/csft-3.2.14
#这里我们要修改 src/sphinxexpr.cpp 文件,将该文件中的 1013、1047、1080 行的 ExprEval 改为
this->ExprEval(这里的行数跟网上的教程说的行数不一样,可能是版本的问题吧,但是如果你用的是我提
供的版本,该行数是正确的),懂点 C++ 的同学也可以自己看看 ExprEval 错在哪里。
#改完上面所说的问题后:
sh buildconf.sh
./configure --prefix=/usr/local/coreseek --with-mmseg-includes=/usr/local/mmseg/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg/lib/
make && make install
在安装的过程中,只要不提示错误 error,那么其他的如 warning 信息都是可以忽略的。
至此我们已经成功的将中文检索引擎安装到我们服务器上来了。
############ 配置文件 ##############
coreseek中得配置文件也是csft.conf,而不是sphinx.conf
cd /usr/local/coreseek/etc
cp sphinx.conf.dist csft.conf
vim csft.conf
其他地方和sphinx配置都一样,对照下面不一样的地方修改
index test1
{
#stopwords = G:datastopwords.txt
#wordforms = G:datawordforms.txt
#exceptions = /data/exceptions.txt
#charset_type = sbcs
添加下面这两行,意思是把中文分词加入到配置文件中
charset_type = zh_cn.utf-8
charset_dictpath = /usr/local/mmseg/etc/ #你安装mmseg的目录
}
################ 生成索引并测试 ################
在mysql中创建数据
CREATE TABLE IF NOT EXISTS `node` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`content` text NOT NULL,
`created` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='测试文章表' AUTO_INCREMENT=11 ;
INSERT INTO `node` (`id`, `title`, `content`, `created`) VALUES
(1, '三月醉一场青春的流年', '三月,醉一场青春的流年。慢步在三月的春光里,走走停停,看花开嫣然,看春雨绵绵,感受春风拂面,春天,就是青春的流年。青春,是人生中最美的风景。青春,是一场花开的遇见', '2018-07-17 11:12:00'),
(2, '在爱的岁月山河里思念', '夜色如梦,没有人陪,坐在沙发里,一杯红酒配电影,似乎看透红尘,实际上钻心的孤独。远在他方的你,是否也一样在深夜里买醉?谁在爱的国度里,想念着谁?谁在梦里,与谁不醉不休?谁在寂寞的夜晚,想象着与谁缠绵悱恻?在爱的幸福国度,你就是我的唯一。', '2018-07-17 11:12:00'),
(3, 'php是世界上最好的语言', '女神:你能让这个知乎程序员板块的人都吵起来,我今晚就跟你走,但是提问不能问xx是不是最好的语言。程序员提问:“PHP是最好的语言”这个梗是怎么来的?女神:这能吵起来?程序员:走着瞧半小时后,知乎炸开了锅,数百回答讨论PHP的是是非非。女神:我了个去,这特么都行。服了,跟你回去就是了。程序员:不行,我一定要说服他们,PHP是最好的语言', '2018-07-17 11:12:00'),
(4, 'mysql', 'mysql is the best database?', '2018-07-17 11:12:00'),
(5, '夏色斑斓,夏意阑珊', '岁月,在风声里歌唱,一如往昔,撩起时光的衣裙。慢步在光阴的旷野,走走停停,看人来人往,看花开花谢,看日出日落。风景如画,往事如诗。那段凯歌,奏响风中的依恋,为你,为我,祭奠旧时的风景。相思豆,将你我的思念串成一个圆圈,你在地球的那头,我在地球的这头。', '2018-07-17 11:12:00'),
(6, '笔墨流芬芳,醉爱文字情', '文字,是一米阳光,温暖着我的心。阳光明媚,我在阳光里享受着它的融融暖意。文字,发着光,发着热,让我的灵魂不再四处漂游。文字,好暖,让我结冰的心湖慢慢融化。阳光,让早已心如死灰的心感受到从未有过的温暖。只要抓住那一米阳光,就等于抓住了一颗救命稻草', '2018-07-17 11:12:00'),
(7, '冬风中一朵紫罗兰', '当时我在窗前。窗里光线幽暗,冷冷清清,窗玻璃紧紧地闭着,木头的窗棂子似乎不堪冷风的肆虐有些瑟瑟发抖,这一切让我原本晦暗的心情更加晦暗,失落的灵魂更加无着无落了。', '2018-07-17 11:12:00'),
(8, '我在红尘中等你', '在这红尘里,我渴望陪你变老,不求一路轰轰烈烈,只愿一世倾心,像山野花儿把最后的生命情葬在秋天,因为你为梦想去漂泊,去了遥远的他乡,我后悔没有与你同行,致使离我而去,你知道我喜欢家乡的宁静,喜欢云的淡然恬静,喜欢山色的空蒙幽深,我喜欢握那一只短笛,诉说心中忧郁,想想走过的人生路,曾经说过相伴一生的你,如今去了南方,那些曾经许下的诺言,早已风吹云散。曾经的温暖,美好的记忆,也许只是一个转身的距离,让我在红尘中等你,今生是如何的结局。', '2018-07-17 11:12:00'),
(9, '阳光的滋味', '明眸善睐,云袖轻舒,花影婆娑,夜鸟伏声。望月,终团圆。融化一季相思苦楚,泪凝妙目。开襟解怀,邀月畅饮。一季愁情尽遣。蘸墨狂书,满腹恩爱无度。羞愧了月里仙子,忧郁了河汉星辰。明月缱惓,夜色飘香。尝遍了相思苦涩,领略这相聚欢欣。', '2018-07-17 11:12:00'),
(10, '走在迷途的拾荒人', '时光就像一个美少女,在低眉浅笑中,就将有些人一些事隔到了光阴的对面。其实光阴从不曾厚过谁也不曾薄过谁,生活就是一种积累,你若储存的温暖多,你的生活就会阳光明媚,你若储存太多寒凉,你的生活就会阴云密布。放下烦恼与忧愁,带着最美的微笑出发,脚下路在,前方希望在,回眸处爱与温暖一直都在。', '2018-07-17 11:12:00');
创建索引
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf --all
测试搜索中文
/usr/local/coreseek/bin/search [-a] -c /usr/local/coreseek/etc/csft.conf '阳光明媚'
注意:如果你设置的coreseek配置文件为csft.conf,则 indexerr、search和searchd时不用带上 -c /usr/local/coreseek/etc/csft.conf,因为默认就是去寻找这个文件
cd testpack
cat var/test/test.xml #此时应该正确显示中文
/usr/local/mmseg3/bin/mmseg -d /usr/local/mmseg3/etc var/test/test.xml #整篇文章进行分词
/usr/local/coreseek/bin/indexer -c etc/csft.conf --all #创建索引
/usr/local/coreseek/bin/search -c etc/csft.conf 网络搜索 #搜索关键字 网络搜索
/usr/local/coreseek/bin/searchd -c etc/csft.conf #正常开启搜索服务
/usr/local/coreseek/bin/searchd -c etc/csft.conf --stop #如要停止搜索服务
/usr/local/coreseek/bin/indexer -c etc/csft.conf --all --rotate #如要已启动服务,要更新索引
################## php 操作sphinx ####################
Sphinx集成到PHP程序中,有两种方式:
1.Sphinx php模块 (编译添加php7下的sphinx扩展)
2.Sphinxapi类 (可以直接使用 /usr/local/src/coreseek-3.2.14/csft-3.2.14/api/sphinxapi.php 文件)
编译扩展:
wget http://pecl.php.net/get/sphinx-1.3.3.tgz
tar zvxf sphinx-1.3.3.tgz
cd sphinx-1.3.3/
/usr/local/php71/bin/phpize
./configure --with-php-config=/usr/local/php71/bin/php-config
提示出错:
checking for libsphinxclient headers in default path... not found
configure: error: Cannot find libsphinxclient headers
找了下libsphinxclient,在/www/soft/csft-3.2.13/api/libsphinxclient,之前安装的是coreseek3.2.13版
cd /usr/local/src/coreseek-3.2.14/csft-3.2.14/api/libsphinxclient
./configure
make && make install
安装完libsphinxclient,继续安装sphinx扩展
发现make 编译出错,可能是版本不兼容,去官网下载匹配php7的最新sphinx扩展
http://git.php.net/?p=pecl/search_engine/sphinx.git;a=snapshot;h=refs/heads/php7;sf=tgz
重新编译安装完成后修改php的配置文件
vim /usr/local/php71/lib/php.ini
加入extension = sphinx.so
重启apache,
/usr/local/apache24/bin/apachectl restart
查看sphinx扩展是否开启
编写php代码测试:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>sphinx</title> </head> <body> <div style="margin:20px;"> <h3>sphinx分词检索</h3> <form action="" method="post"> 关键字:<input type="text" name="keyword" value="<?php echo isset($_POST['keyword'])?$_POST['keyword']:null?>"> <br> <input type="submit" value="检索"> </form> </div> </body> </html> <?php if($_SERVER['REQUEST_METHOD'] == 'POST'){ require_once 'sphinxapi.php'; echo '<h3>检索信息:</h3>'; $keyword = isset($_POST['keyword'])?$_POST['keyword']:null; //访问Sphinx获得主键值 $sphinx = new SphinxClient(); $sphinx->SetServer('localhost',9312); $sphinx->SetConnectTimeout(10);//设置连接的超时时间 //$sphinx->SetMaxQueryTime(30);//设置最大的查询时间 //$sphinx->SetArrayResult(true);//设置Sphinx返回结果的类型 /* * 切词方式 * SPH_MATCH_ALL:切词。所有词完全匹配 * SPH_MATCH_ANY:切词。只要有一个词匹配 * SPH_MATCH_PHRASE:不切词 */ $sphinx->SetMatchMode(SPH_MATCH_ANY);//设置切词方式 //查询索引文件 node_ind,node_ind_delta $result = $sphinx->Query($keyword, '*'); if (isset($result['matches'])) { /* Matches中就是我们匹配的结果,但是仿佛不是我们想要的数据,比如 titile,content字段的内容就没有匹配出来,根据官方的说明是 Sphinx 并没有连接到 MySQL去取数据,只是根据它自己的索引内容进行计算,因此如果想用 Sphinx 提供的API 去取得我们想要的数据,还必须以查询的结果为依据,再次查询 MySQL从而得到我们想要的数据 */ $ids = join(',', array_keys($result['matches'])); try{ $pdo = new PDO('mysql:host=127.0.0.1;dbname=coreseek', 'root', 'root'); $res = $pdo->query('select * from node where id in ('.$ids.')'); $data = $res->fetchAll(PDO::FETCH_ASSOC); $opts = [ 'before_match' => '<font style="color:red;font-weight:bold">', 'after_match' => '</font>' ]; foreach ($data as $row) { // 高亮关键字 $light = $sphinx->buildExcerpts($row, 'node_ind', $keyword, $opts); echo '编号:'.$light[0].'<br>'; echo '标题:'.$light[1].'<br>'; echo '内容:'.$light[2].'<br>'; echo '创建时间:'.$light[3].'<hr>'; } } catch (PDOException $e){ echo $e->getMessage(); } } else { echo '没有匹配到数据@'; } } ?>
安装coreseek 可能会出现的错误:
cd ../csft-4.1/
sh buildconf.sh ##警告可以忽略
./configure --prefix=/usr/local/coreseek --without-python --without-unixodbc --with-mmseg --with-mmseg-includes=/usr/local/mmseg/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg/lib/ --with-mysql
make ##警告可忽略
make install
###可能会报的错
1. sh buildconf.sh 报错 automake: warnings are treated as errors
#解决办法 将configure.ac文件的
AM_INIT_AUTOMAKE([-Wall -Werror foreign]) 修改为
AM_INIT_AUTOMAKE([-Wall foreign])subdir-objects
2.make报错1
make[2]: *** [sphinxexpr.o] Error 1
make[2]: Leaving directory `/root/coreseek-4.1-beta/csft-4.1/src'
make[1]: *** [all] Error 2
make[1]: Leaving directory `/root/coreseek-4.1-beta/csft-4.1/src'
make: *** [all-recursive] Error 1
##解决办法
将src目录下sphinxexpr.cpp 文件的所有的
T val = ExprEval ( this-m_pArg, tMatch );
修改为
T val = this->ExprEval ( this-m_pArg, tMatch );
然后执行 make clean 在执行make
3.make 报错2
collect2: error: ld returned 1 exit status
make[2]: *** [indexer] Error 1
make[2]: Leaving directory `/root/coreseek-4.1-beta/csft-4.1/src'
make[1]: *** [all] Error 2
make[1]: Leaving directory `/root/coreseek-4.1-beta/csft-4.1/src'
##解决办法
编辑configure 文件 修改 #define USE_LIBICONV 1 的 1 修改为0
参考文档:
https://zhuanlan.zhihu.com/p/40040761
https://www.linuxidc.com/Linux/2017-05/143599.htm