Coreseek-带中文分词的Sphinx

天涯浪子 提交于 2020-01-28 02:22:33

什么是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>
index.php
<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>
find.php

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  远程
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!