Centos7 下coreseek的安装

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:\data\stopwords.txt

#wordforms                   = G:\data\wordforms.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

posted @ 2019-02-16 19:56  白開水  阅读(406)  评论(0编辑  收藏  举报