2009年5月15日星期五

sphinx的一点使用心得

为什么要用到sphinx呢?全文搜索,在此方面sphinx非常优秀。
为什么不考虑Lucene? 避免引入过多的复杂性,Lucene是基于Java的程序,我现在是对一个光盘镜像数据库进行索引,光盘的描述信息都存储在了和光盘镜像同名的的xml文件中,搜索界面直接用php和python即可,很简单,不想引入Java,在服务器上也不用过多配置了,另外,考虑到sphinx有一个xmlpipe驱动,我以为我只要写一个程序读取所有的xml文档,然后按照要求输出即可。xml文件信息中没有数据库中id的概念,而是根据上传时间生成了一个时间字符串,精确到秒,比如20090514101210. 我按照我的想法做了,发现一个问题
(1)Sphinx作为文档id的话,必须要求int值,在这里我是想直接使用时间字符串来做,可以经过实验发现sphinx最多支持id的长度为10位,也就是100亿,而时间字符串超长了。
(2)Sphinx在索引时并没有存储原始信息内容,所以搜索结果除了文档ID,什么也得不到,需要根据ID重新获取记录的原文,这样在没有数据库的条件下,从XML中检索效率太低,本来考虑在建立索引的时候,生成一个文档id到记录原文的索引,然后从此索引中拿数据,但是这样觉得多此一举,sphinx对于mysql是原生支持的,所以还是转换一次,从xml数据到mysql数据库,再用sphinx检索才可以。

从这两方面来讲,sphinx还是不能和Lucene比的,Lucene索引的数据中就可以直接获取摘要不用再从纪录集中取了,对于任何性质的文档都可以进行索引了。Sphinx的优点就是简单快速,所以要根据需要灵活选取了,为了不引入Java,我在此项目中还是使用sphinx好了。

没有评论: