Sphinx+Mysql初使用体验

应用越来越多的需要全文搜索技术来支撑,在Java中可以使用Lucene,一个非常优秀的引擎,在Hibernate中也整合了Lucene来做检索,但在使用PHP的过程中迫切需要找一个优秀的全文搜索引擎(虽然也可以把PHP和Lucene结合起来使用,但有些另类,有些生产环境也不能同时支持),以前在网上看到一些Sphinx的文章,一直没有实践,昨天我就花了一天的时间,配置测试了一下Sphinx。

由于我的PHP没有编译Sphinx模块,所以我主要是配置Sphinx+Mysql,在Mysql上测试全文搜索的效果,Mysql、Sphinx、中文分词的编译安装过程不详述,下面两篇文章挺好,安装时可以参考

Mysql+sphinx+中文分词简介

基于Sphinx+MySQL的千万级数据全文检索(搜索引擎)架构设计

我的编译安装过程没有遇到什么麻烦,就是编译Mysql的时候比较长,而且要注意把Innodb的引擎编译进去,我的Mysql编译参数如下

./configure –with-plugins=sphinx,innobase,heap –prefix=/usr/local/mysql –enable-assembler –with-charset=utf8 –with-extra-charsets=all –enable-thread-safe-client –with-big-tables –with-readline –with-ssl –with-embedded-server –enable-local-infile

比较奇怪的是innodb是支持了,heap不支持,这个问题下次再研究。

通过编译Mysql,使Mysql支持了Sphinx存储引擎,试了一下Sphinx的例子,成功搜索到了数据,如果我们要对自己的数据做索引,就要研究一下Sphinx的配置文件了。

Sphinx的配置文件在其安装目录下的etc目录下,你可以参考其例子的sphinx.conf创建自己的配置文件,在sphinx里有主要要配置的有两大块,一部分是source(数据源),另一部分是index(索引),source里面定义了连接数据库的参数,取得源数据的SQL,也就是你要索引的数据的取得 SQL(Sphinx是支持不同数据源的,我这里只测试SQL),source可以有继承关系,继承的source可以用来做取得增量数据,index里面定义了使用哪个source,index存放的路径、字符集、辞典等等,index也可以继承,继承的index用来做增量索引。由此可见source 和index都是根据你的需要配置的,可以取得多个数据源的数据,可以建立多个索引。

增量索引的小困惑,我在数据库中增加了2条记录,执行

/usr/local/sphinx/bin/indexer –rotate –config /usr/local/sphinx/etc/sphinx.conf test1stemmed

看到有两个文档被加入索引(增量部分),之后我执行

/usr/local/sphinx/bin/indexer –rotate –merge test1 test1stemmed –merge-dst-range deleted 0 0

将增量索引并入主索引,这是可以查询到新插入的数据,这时我再继续插入一条数据,执行

/usr/local/sphinx/bin/indexer –rotate –config /usr/local/sphinx/etc/sphinx.conf test1stemmed

提示信息是有3个文档被加入索引,让我非常奇怪,因为上两条纪录已经并入主索引了,这次怎么还会索引呢?之后我执行

/usr/local/sphinx/bin/indexer –rotate –config /usr/local/sphinx/etc/sphinx.conf test1

更新主索引,之后再执行/usr/local/sphinx/bin/indexer –rotate –config /usr/local/sphinx/etc/sphinx.conf test1stemmed提示没有索引加入,这样就正确了,如果按照测试的结果,增量索引和主索引更新执行的时间要计划好。

关于中文分词–LibMMSeg:LibMMSeg 是Coreseek.com为 Sphinx 全文搜索引擎设计的中文分词软件包,其在GPL协议下发行的中文分词法,采用Chih-Hao Tsai的MMSEG算法。

同时Coreseek.com提供了一份Sphinx的中文文档,里面有比较详细的配置说明,是很好的参考资料,非常感谢开源人士做出的贡献。

Oracle收购SUN之后

北京时间4月20日晚一条IT界的爆炸性消息传来–《甲骨文将以74亿美元收购Sun》,这个消息确实让人非常意外,因为在之前传出IBM和Sun之间的收购谈判破裂的消息,是Oracle突然接手?应该不是,估计SUN早已有卖掉的计划,只是看谁出价合理吧。

对于Java开发阵营来说,这条消息未必是坏事,毕竟Oracle手里已经有了BEA,在Java企业级应用里就是领头羊,而SUN本身就没有在Java身上赚到钱,相信应该可以更好的整合Java的企业级应用,另外Oracle本身已经使用了非常多的Java技术,两个公司之前也有比较多的合作。

这笔收购让人最担心的还是Mysql,去年SUN收购Mysql,就让人感觉颇为另类,现在Oracle收购SUN,真不知道Oracle会怎样处理Mysql,任其自然发展,还是直接消灭,我想做为广大支持开源的开发者,都不希望Mysql倒掉,更何况当今大多数的Web2.0公司都在使用Mysql,不乏像Facebook这样的大容量用户,如果Mysql没有了,“LAMP”里的M会变成什么?PostgreSQL?还是其他?

商人逐利,这是自古以来的道理,并购的背后,一定有商业利益的存在,收购方希望整合资源、扩大市场、增加利润,被收购方希望套现,一个愿打一个愿挨,无可厚非,但他们究竟会如何面对最终客户,我们只能拭目以待了。

Mysql的一些常用命令

自定义Mysql启动命令

/usr/local/mysql/bin/mysqld –defaults-extra-file=/usr/local/mysql/my.cnf –basedir=/usr/local/mysql –datadir=/usr/local/mysql/data –user=mysql –log-error=/usr/local/mysql/data/localhost.localdomain.err –pid-file=/usr/local/mysql/data/localhost.localdomain.pid –socket=/tmp/mysql.sock –port=3306

通过定义里面的参数,可以在一个机子上启动多个Mysql实例在不同的端口

CREATE USER ‘username’@’%’ IDENTIFIED BY ‘password’;
创建用户,%代表可以来自任何主机,如果是本机,可以写localhost

GRANT ALL PRIVILEGES ON * . * TO ‘username’@’%’ IDENTIFIED BY ‘password’ WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0
给用户赋所有权限,也可以根据需要,赋特定的权限

导出一个库
mysql/bin/mysqldump -u user -p password dbname > /full/path/dbname.sql

导入一个库
mysql -u user -p password –default-character-set=utf8 dbname < /full/path/dbname.sql --default-character-set是指定数据库编码