1.coreseek简介
首先coreseek是基于sphinx(目前流行的全文搜索引擎),增加了中文分词功能,效果比较不错。世面上还有一些具有分词的功能的软件 eg:Scws ,其也可以和sphinx组合完成中文分词搜索(Scws + Sphinx)。
目前coreseek的稳定版本在coreseek3.2, coreseek4.1为现在测试版本。coreseek3.2在其sphinx配置文件中支持的属性有限,
有支持sql_attr_uint,sql_attr_bool,sql_attr_bigint,sql_attr_timestamp,sql_attr_str2ordinal,sql_attr_float,sql_attr_multi等,4.1增加了对字符串的支持sql_attr_string,sql_field_string等,以上以sql_attr开头的属性sphinx只对其做存储,检索不使用; sql_field开头用于检索。
2.从网上下载coreseek4.1版本的文件coreseek-4.1-beta.tar.gz,进入centos7下coreseek安装步骤
#安装依赖包 [root@E sphinx]# yum install make gcc g++ gcc-c++ libtool autoconf automake imake mysql-devel libxml2-devel expat-devel #解压缩 [root@E sphinx]# tar zxvf coreseek-4.1-beta.tar.gz #安装mmseg [root@E sphinx]# cd coreseek-4.1-beta/mmseg-3.2.14/ [root@E mmseg-3.2.14]# ./bootstrap #输出的warning信息可以忽略,如果出现error则需要解决 [root@E mmseg-3.2.14]# ./configure --prefix=/usr/local/mmseg3 [root@E mmseg-3.2.14]# make && make install [root@E mmseg-3.2.14]# cd .. ##安装coreseek [root@E coreseek-4.1-beta]# cd csft-4.1/ [root@E csft-4.1]# sh buildconf.sh #输出的warning信息可以忽略,如果出现error则需要解决 [root@E csft-4.1]# ./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 [root@E csft-4.1]# make && make install [root@E csft-4.1]# cd .. #测试mmseg分词,coreseek搜索(需要预先设置好字符集为zh_CN.UTF-8,确保正确显示中文) [root@E coreseek-4.1-beta]# cd testpack/ [root@E testpack]# cat var/test/test.xml #此时应该正确显示中文 #mmseg程序 -d 词库目录 指定数据源 [root@E testpack]# /usr/local/mmseg3/bin/mmseg -d /usr/local/mmseg3/etc var/test/test.xml #创建索引 [root@E testpack]# /usr/local/coreseek/bin/indexer -c etc/csft.conf --all #执行搜索测试 [root@E testpack]# /usr/local/coreseek/bin/search -c etc/csft.conf 网络搜索 #测试成功 Coreseek Fulltext 4.1 [ Sphinx 2.0.2-dev (r2922)] Copyright (c) 2007-2011, Beijing Choice Software Technologies Inc (http://www.coreseek.com) using config file 'etc/csft.conf'... index 'xml': query '网络搜索 ': returned 1 matches of 1 total in 0.000 sec displaying matches: 1. document=1, weight=1590, published=Thu Apr 1 22:20:07 2010, author_id=1 words: 1. '网络': 1 documents, 1 hits 2. '搜索': 2 documents, 5 hits
编译coreseek遇到的问题,见该博客另一片文章。
以上是对xml为源数据进行索引,中文搜索的步骤。
coreseek-4.1-beta/testpack/etc 文件夹下包含所有类型生成索引的配置文件,其中csft_mysql.conf是以mysql数据库为源的
下面看下csft_mysql.conf中的内容
#MySQL数据源配置,详情请查看:http://www.coreseek.cn/products-install/mysql/ #请先将var/test/documents.sql导入数据库,并配置好以下的MySQL用户密码数据库 #源定义 source mysql { type = mysql sql_host = localhost sql_user = root sql_pass = sql_db = test sql_port = 3306 sql_query_pre = SET NAMES utf8 sql_query = SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content FROM documents #sql_query第一列id需为整数 #title、content作为字符串/文本字段,被全文索引 sql_attr_uint = group_id #从SQL读取到的值必须为整数 sql_attr_timestamp = date_added #从SQL读取到的值必须为整数,作为时间属性 sql_query_info_pre = SET NAMES utf8 #命令行查询时,设置正确的字符集 sql_query_info = SELECT * FROM documents WHERE id=$id #命令行查询时,从数据库读取原始数据信息 } #index定义 index mysql { source = mysql #对应的source名称 path = var/data/mysql #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... docinfo = extern mlock = 0 morphology = none min_word_len = 1 html_strip = 0 #中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/ charset_dictpath = /usr/local/mmseg3/etc/ #BSD、Linux环境下设置,/符号结尾 #charset_dictpath = etc/ #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/... charset_type = zh_cn.utf-8 } #全局index定义 indexer { mem_limit = 128M } #searchd服务定义 searchd { listen = 9312 read_timeout = 5 max_children = 30 max_matches = 1000 seamless_rotate = 0 preopen_indexes = 0 unlink_old = 1 pid_file = var/log/searchd_mysql.pid #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... log = var/log/searchd_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... query_log = var/log/query_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... binlog_path = #关闭binlog日志 }
如果想要简单的运行下mysql的中文源搜索,注意要修改下里面的数据库配置,里面文件的路径,在实际应用中我用的绝对路径。使用过程中有可能报无法连接mysql.sock的问题(index ‘mysql’: sql_connect: Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock),查找自己mysql启动后,mysql.sock所在的实际路径,在csft_mysql.conf文件中明确设置下,下面是我实际中运行的csft_mysql.conf文件内容。
#MySQL数据源配置,详情请查看:http://www.coreseek.cn/products-install/mysql/ #请先将var/test/documents.sql导入数据库,并配置好以下的MySQL用户密码数据库 #源定义 source mysql { type = mysql sql_host = localhost sql_user = root sql_pass = sql_db = test sql_port = 3306 sql_query_pre = SET NAMES utf8 sql_sock = /tmp/mysql.sock sql_query = SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title,content FROM documents #sql_query第一列id需为整数 #title、content作为字符串/文本字段,被全文索引 sql_attr_uint = group_id #从SQL读取到的值必须为整数 sql_attr_timestamp = date_added #从SQL读取到的值必须为整数,作为时间属性 sql_attr_string = title sql_attr_string = content sql_query_info_pre = SET NAMES utf8 #命令行查询时,设置正确的字符集 sql_query_info = SELECT * FROM documents WHERE id=$id #命令行查询时,从数据库读取原始数据信息 } #index定义 index mysql { source = mysql #对应的source名称 path = /usr/local/coreseek/var/data/mysql #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... docinfo = extern mlock = 0 morphology = none min_word_len = 1 html_strip = 0 #中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/ charset_dictpath = /usr/local/mmseg3/etc/ #BSD、Linux环境下设置,/符号结尾 #charset_dictpath = etc/ #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/... charset_type = zh_cn.utf-8 } #全局index定义 indexer { mem_limit = 128M } #searchd服务定义 searchd { listen = 9312 listen = 9306:mysql41 read_timeout = 5 max_children = 30 max_matches = 1000 seamless_rotate = 0 preopen_indexes = 0 unlink_old = 1 pid_file = /usr/local/coreseek/var/log/searchd_mysql.pid #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... log = /usr/local/coreseek/var/log/searchd_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... query_log = /usr/local/coreseek/var/log/query_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... binlog_path = #关闭binlog日志 }
我的mysql.sock路径为/tmp/mysql.sock。具体的sphinx详细的mysql配置见该博客下另一篇文章。
将/usr/local/coreseek/etc/example.sql导入到mysql数据库中,下面的配置文件中的查询语句是基于example.sql中的数据表
下面是mysql源的操作如下:
#创建mysql数据源索引成功 [root@E testpack]# /usr/local/coreseek/bin/indexer -c etc/csft_mysql.conf --all Coreseek Fulltext 4.1 [ Sphinx 2.0.2-dev (r2922)] Copyright (c) 2007-2011, Beijing Choice Software Technologies Inc (http://www.coreseek.com) using config file 'etc/csft_mysql.conf'... indexing index 'mysql'... collected 3 docs, 0.0 MB sorted 0.0 Mhits, 100.0% done total 3 docs, 7545 bytes total 0.016 sec, 467269 bytes/sec, 185.79 docs/sec total 3 reads, 0.000 sec, 2.8 kb/call avg, 0.0 msec/call avg total 9 writes, 0.000 sec, 2.2 kb/call avg, 0.0 msec/call avg #测试mysql数据源 搜索 [root@E testpack]# /usr/local/coreseek/bin/search -c etc/csft_mysql.conf 网络搜索 Coreseek Fulltext 4.1 [ Sphinx 2.0.2-dev (r2922)] Copyright (c) 2007-2011, Beijing Choice Software Technologies Inc (http://www.coreseek.com) using config file 'etc/csft_mysql.conf'... index 'mysql': query '网络搜索 ': returned 1 matches of 1 total in 0.000 sec displaying matches: 1. document=1, weight=1590, group_id=2, date_added=Thu Apr 1 22:20:07 2010 id=1 title=愚人节最佳蛊惑爆料 谷歌300亿美元收购百度 content=据国外媒体报道,谷歌将巨资收购百度,......<正文省略很多字>......李彦宏也承认当前百度在日本还处于初级发展阶段,但他也预言“2012年,百度与Google划洋而治”,对此我们拭目以待! date_added=2010-04-01 22:20:07 author_id=1 group_id=2 words: 1. '网络': 1 documents, 1 hits
重建索引时报错误:WARNING: failed to open pid_file ‘/usr/local/coreseek/var/log/searchd_mysql.pid’.
解决方法:
试着停止一下coreseek服务
/usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft_mysql.conf –stop 停止服务
然后重启
/usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft_mysql.conf 启动服务
再次建立索引
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf –all 建立索引
如果提示:FATAL: failed to lock /usr/local/coreseek/var/data/xxxx.spl: Resource temporarily unavailable, will not index. Try –rotate option.
则尝试重建索引
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf –all –rotate 重建索引
3.php测试coreseek
sphinx提供了专门的api文件sphinxapi.php在coreseek-4.1-beta/testpack/api文件夹下面
测试方法一:将sphinxapi.php放到测试目录下,在测试目录下编辑如下文件
header("Content-type: text/html; charset=utf-8"); //require("./ "); $s = new SphinxClient; $s->setServer("127.0.0.1", 9312); //SPH_MATCH_ALL, 匹配所有查询词(默认模式); SPH_MATCH_ANY, 匹配查询词中的任意一个; SPH_MATCH_EXTENDED2, 支持特殊运算符查询 $s->setMatchMode(SPH_MATCH_ALL); $s->setMaxQueryTime(30); //设置最大搜索时间 $s->SetArrayResult(false); //是否将Matches的key用ID代替 $s->SetSelect ( "*" ); //设置返回信息的内容,等同于SQL $s->SetRankingMode(SPH_RANK_BM25); $s->SetLimits ( 0, 30, 1000, 0 ); //设置结果集偏移量 SetLimits $res = $s->query('coreseek','mysql','--single-0-query--'); #[coreseek]关键字,[mysql]数据源source $err = $s->GetLastError(); echo '<pre>'; var_dump($res); var_dump($res['matches']); var_export($err); echo '</pre>';
shell下执行php test.php命令,结果如下图:
测试方法二:安装php sphinx扩展
【第一步】:
# 进入coreseek-4.1-beta/csft-4.1/api/libsphinxclient/目录 # ./configure --prefix=/usr/local/sphinxclient configure: creating ./config.status config.status: creating Makefile config.status: error: cannot find input file: Makefile.in #报错configure失败 //处理configure报错 编译过程中报了一个config.status: error: cannot find input file: src/Makefile.in这个的错误,然后运行下列指令再次编译就能通过了: # aclocal # libtoolize --force # automake --add-missing # autoconf # autoheader # make clean //从新configure编译 # ./configure # make && make install
【第二步】
http://pecl.php.net/package/sphinx # wget http://pecl.php.net/get/sphinx-1.3.0.tgz # tar zxvf sphinx-1.3.0.tgz # cd sphinx-1.3.0 # phpize # ./configure --with-php-config=/usr/bin/php-config --with-sphinx=/usr/local/sphinxclient # make && make install # cd /etc/php.d/ # cp gd.ini sphinx.ini # vi sphinx.ini extension=sphinx.so # service php-fpm restart
# ./configure –with-php-config=/usr/bin/php-config –with-sphinx=/usr/local/sphinxclient 执行时有可能报错 configure: error: Cannot find php-config. Please use –with-php-config=PATH
修改下php-config的路径就行了, # ./configure –with-php-config=/usr/local/php/bin/php-config –with-sphinx=/usr/local/sphinxclient
特别注意编译完之后会生成sphinx.so 需要添加到php扩展中去。
安装完PHP的Sphinx扩展后,就可以直接使用$coreseek = new SphinxClient();而无需引入源文件了。
测试文件如下:
$sphinx = new SphinxClient(); $sphinx->SetServer("127.0.0.1",9312); $sphinx->SetMatchMode(SPH_MATCH_ALL); $sphinx->SetLimits(0, 20, 1000); $sphinx->SetArrayResult(true); $result = $sphinx -> query("LSGO实验室","mysql`"); print_r($result);
上图中sql_attr_string 中对应数据库中的title,但打印出来显示的是数字。这种原因是 php的sphinx扩展的版本不对导致的;当前用的版本为sphinx-1.1.0,对应coreseek3.2.14版本,1.1.0是个分界线;
下载sphinx-1.3.3.tgz重新编译,生成sphinx.so,然后重新执行结果如图:
上图为结果值。
参考文件:
http://blog.csdn.net/baidu_30000217/article/details/51774581
http://blog.csdn.net/baidu_30000217/article/details/51771263
http://www.111cn.net/sys/CentOS/63329.htm
http://www.cnblogs.com/zhangyabin—acm/p/5926054.html
http://www.jianshu.com/p/240c00982e08
资料文件下载:
sphinx-2.2.11-1.rhel7.x86_64.zip
coreseek 中文参考手册 :http://github.tiankonguse.com/doc/sphinx/coreseek_4.1-sphinx_2.0.1-beta.html
coreseek4.1 中文参考手册地址:http://github.tiankonguse.com/doc/sphinx/coreseek_4.1-sphinx_2.0.1-beta.html