一 sphinx 简介
在 使用mysql数据库过程中,如果想实现全文检索的优化,可以使用mysql自带全文索引,但是不支持中文。。关于sphinx的安装网上很多教程写的都 不错比如:http://www.coreseek.cn/products-install/。这里就不再说明安装方法了。有兴趣的可以自己参考。
MySQL在高并发连接、数据库记录数较多的情况下,SELECT ... WHERE ... LIKE ‘%...%‘的
全文搜索方式不仅效率差,而且以通配符%和_开头作查询时,使用不到索引,需要全表扫描,对数
据库的压力也很大。MySQL针对这一问题提供了一种全文索引解决方案,这不仅仅提高了性能和效
率(因为MySQL对这些字段做了索引来优化搜索),而且实现了更高质量的搜索。但是,至今为
止,MySQL对中文全文索引无法正确支持。
可 以使用Sphinx(一种全文检索引擎)技术,Sphinx默认不支持中文索引及检索。以前用Coreseek的补丁来解决,目前Coreseek 不单独提供补丁文件,而基于sphinx开发了Coreseek 全文检索服务器,Coreseek应该是现在用的最多的sphinx中文全文检索,它提供了为Sphinx设计的中文分词包LibMMSeg包含 mmseg中文分词。
Sphinx的基本原理与检索流程
这种检索流程使用sphinx官方为我们提供的API文件(php使用sphinxapi.php),首先php通过这个api连接sphinx服务器,获取查询结果的id信息,然后再通过这些id从mysql数据库中 取得相关的数据。
SphinxSE -- 基于Sphinx存储引擎检索(以后再详细介绍)
二、 Sphinx安装
Sphinx在mysql上的应用有两种方式:
- 采用API调用,如使用PHP、java等的API函数或方法查询。优点是可不必对mysql重新编译,服务端进程“低耦合”,且程序可灵活、方便的调用;缺点是如已有搜索程序的条件下,需修改部分程序。推荐程序员使用。
- 使用插件方式(sphinxSE)把sphinx编译成一个mysql插件并使用特定的sql语句进行检索。其特点是,在sql端方便组合,且能直接返回数据给客户端。不必二次查询,在程序上仅需要修改对应的sql,但这对使用框架开发的程序很不方便,比如使用了ORM。另外还需要对mysql进行重新编译,且需要mysql-5.1以上版本支持插件存储。
这里的安装主要介绍的是第一种通过api调用的方式。Sphinx的安装如下:
#下载最新稳定版 该方式不支持中文分词 wget http://www.sphinxsearch.com/downloads/sphinx-0.9.9.tar.gz tar xzvf sphinx-0.9.9.tar.gz cd sphinx-0.9.9 ./configure --prefix=/usr/local/sphinx/ --with-mysql --enable-id64 make make install
三、 Sphinx中文分词
中文的全文检索和英文等latin系列不一样,后者是根据空格等特殊字符来断词,而中文是根据语义来分词。中文分词主要有2个插件
- Coreseek
Coreseek是现在用的最多的sphinx中文全文检索,它提供了为Sphinx设计的中文分词包LibMMSeg ,是基于sphinx的基础上开发的。
- sfc(Sphinx-for-chinese)
sfc(sphinx-for-chinese)是由网友happy兄提供的另外一个中文分词插件。其中文词典采用的是xdict。
还有遇到的问题修改 比如
如果你的gcc>=4.7安装的过程中:会make编译不通过,提示: error: ‘ExprEval’ was not declared in this scope
解决办法:
搜索之后,仅找到一个有用的链接:http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=667378, 是关于coreseek上游的sphinx的同样问题的,看了一下了解似乎是gcc 4.7、gcc 4.8的C++作用域的问题(?),上面的debian bugs里面提供了一个patch,看了下patch的内容,也对自己本地的coreseek的制作了同样的补丁,压缩包发布如下,使用时注意版本:
解压后,用sphinxexpr.cpp覆盖coreseek-4.1-beta/csft-4.1/src下的同名文件重新编译即可