• 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: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

  • 相关阅读:
    python列表--查找集合中重复元素的个数
    python3-打印一个进度条
    python3-sys模块
    python3-字符串操作
    python3-深浅复制
    python3-os模块
    接口和抽象类有什么区别
    集合知识
    面向对象的特征有哪些方面
    javadoc时候乱码-编码 GBK 的不可映射字符
  • 原文地址:https://www.cnblogs.com/cshaptx4869/p/10387990.html
Copyright © 2020-2023  润新知