Sphinx中文分词Coreseek+Mmseg安装配置和示例

时间:2022-10-06 08:24:50

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/48897589

Coreseek+Mmseg 实现中文分词的安装配置的记录笔记。

安装前首先安装依赖的软件包

yum install make gcc g++ gcc-c++ libtool autoconf automake imake  libxml2-devel expat-devel
下载并编译安装mmseg:

wget http://www.coreseek.cn/uploads/csft/4.0/coreseek-4.1-beta.tar.gz 
tar -zxvf coreseek-4.1-beta
cd mmseg-3.2.14
./bootstrap
./configure --prefix=/usr/local/mmseg3

make && make install

编译mmseg提示cannot find input file: src/Makefile.inaclocal 错误的解决办法

执行:

libtoolize --force
automake --add-missing
autoconf
autoheader
make clean
./configure --prefix=/usr/local/mmseg3

make && make install
编译安装Coreseek,其实就是Sphinx的中文修改版

cd csft-3.2.14/
sh buildconf.sh

./configure --prefix=/usr/local/coreseek --without-unixodbc --with-mmseg --with-mmseg-includes=/usr/local/mmseg3/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg3/lib/ --with-mysql=/usr/local/mysql/

make && make install
若仍提示 libiconv无法找到,需要修改vi src/Makefile 文件,找 LIBS = 开头的行,

LIBS = -lm -lz -lexpat -L/usr/local/lib –lpthread
修改成
LIBS = -lm -lz -lexpat -liconv -L/usr/local/lib -lpthread

到这里我们的Coreseek + Mmseg 的安装就结束了,下面就来玩一下中文分词了,在Coreseek的包中提供了一个测试用的数据库example.sql,就用这个数据库测试,将该数据库导入。

简单配置一下,在 /usr/local/coreseek/etc 下面新建sphinx.cof的配置文件,内容如下:

source src1
{
type= mysql

sql_host= localhost
sql_user= root
sql_pass= yuansir
sql_db= test
sql_port= 3306# optional, default is 3306

sql_query= \
SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \
FROM documents

sql_attr_uint= group_id
sql_attr_timestamp= date_added

sql_query_info= SELECT * FROM documents WHERE id=$id
}


index test1
{
source= src1
path= /usr/local/coreseek/var/data/test1
docinfo= extern
charset_type= zh_cn.utf-8
charset_dictpath= /usr/local/mmseg3/etc/
ngram_len = 0
}


indexer
{
mem_limit= 32M
}


searchd
{
port= 9312
log= /usr/local/coreseek/var/log/searchd.log
query_log= /usr/local/coreseek/var/log/query.log
read_timeout= 5
max_children= 30
pid_file= /usr/local/coreseek/var/log/searchd.pid
max_matches= 1000
seamless_rotate= 1
preopen_indexes= 0
unlink_old= 1
}
修改/usr/local/mmseg3/etc 下面的mmseg.ini如下:
[mmseg]
merge_number_and_ascii=0; ;合并英文和数字 abc123/x
number_and_ascii_joint=-; ;定义可以连接英文和数字的字符
compress_space=1; ;暂不支持
seperate_number_ascii=0; ;就是将字母和数字打散
至此一个简单的配置就完成了,具体配置项说明请去 Coreseek的官方文档查看,很全面,这里只配置了一个数据源和一个索引。
我使用的PHP的API来操作Sphinx,所以如果你PHP没有主持Sphinx扩展的话,先要安装PHP的Sphinx扩展,当然也可以直接引入Sphinx包中的PHP的API文件就可以了,
如何安装PHP扩展以前博客里面写过,就不重复了。然后就来启动sphinx服务和建立索引。

/usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/sphinx.conf
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/sphinx.conf --rotate --all
searchdindexer的具体参数请参考官方文档。
新建一个PHP测试脚本:
/**
* sphinx 测试脚本
* @authorliuyazhuang
*/
$sp = new SphinxClient();// 实例化sphinx,这里使用的是PHP的Sphinx扩展
$sp->setServer('192.168.1.100', 9312) or die("can't connect to sphinx");//选择服务器
$sp->setConnectTimeout(1);//连接超时设置
$sp->setMatchMode(SPH_MATCH_ANY);//设置全文查询的匹配模式
$sp->setArrayResult(TRUE);//控制搜索结果集的返回格式
$res = $sp->query('我叫刘亚壮', 'test1'); //执行搜索查询,‘我叫刘亚壮’为关键词,test1索引名称 (可以为多个,使用逗号分割,或者为“*”表示全部索引).

$conn = mysql_connect('192.168.106.131:3306', 'root', 'root') or die("can't connect to the mysql");
mysql_select_db('test', $conn);
mysql_query("SET NAMES utf8");

if (isset($res['matches'])) {
//获取匹配的id,并组成(1,2)这样的sql where查询条件格式
foreach ($res['matches'] as $item) {
$id[] = $item['id'];
}
$ids = join(',', $id);
$query = mysql_query("SELECT title,content From documents WHERE id IN({$ids})");

while ($row = mysql_fetch_array($query)) {
$options = array("before_match" =>" <font color='red'>", "after_match" =>"</font>","chunk_separator"=>'',"limit"=>300);
$result = $sp->buildExcerpts($row, 'test1', '我叫刘亚壮', $options); //生成摘要
echo $result[1] . "<br/><br/>" . $result[2] . "<br/><br/><br/>";
}
}

具体sphinx的api实现可以去php官方手册上查询。这里buildExcerpts方法就是将结果关键词高亮显示了,到此大功告成