子非鱼,安知鱼之乐?

我的程序人生,累并快乐着。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Python下的Lucene,PyLucene

Posted on 2006-10-25 21:55  Jason Cui  阅读(7639)  评论(4编辑  收藏  举报

下一个项目准备用Python+Django来完成,先做些技术准备。数据库方面用Django已经试验的差不多了,但是似乎性能很差。自己编译了Mysql,用虚拟机测试,生成1000个用户,1000篇文章用时80秒,这种并发性能恐怕没有办法让人满意。(每篇文章需要单独生成Tag和文章与Tag的对应关系,涉及8次数据库操作。)花了一天时间试验InnoDB和MyIsam的区别,但是似乎没有影响,开不开Transaction都一样。先不管它了,也许和我的机器硬件有关系,硬件的sync关不掉。看官方的说法,SlashDot用Django可以实现每秒800条数据的插入速度。

网站肯定要用到全文检索,目前唯一的全文检索解决方案就是Lucene了,.Net上也有Lucene.Net可以选。搜索了一下,发现了PyLucene,这个Python上的Lucene实现。似乎是使用Python对Lucene进行了一次重新包装。

下载了它的Windows版本,安装比较简单,直接把几个库文件复制到对应的Lib目录就行了。运行了一下Sample目录下的测试文件,先是用IndexFiles和SearchFiles试了一下,SearchFiles是接收参数来搜索的,但是我没有办法输入中文,会出现错误提示。后来把要搜索的词直接放到文件里面去,不报错了,但是搜索不出来。本以为PyLucene不支持中文,正在纳闷豆瓣的搜索是怎么做的,突然发现了一个好东西。

看了一下sample目录下的LuceneInAction目录,里面居然有个ChineseTest文件。它调用的是另一个目录下的测试文件,测试一个汉字的搜索,运行了一下,居然是成功的。再看了一下IndexFiles,里面读文件用的编码是英文编码,改成GB2312,OK,可以搜索到了。但是只能搜索单字,不能按词搜索。只要输入两个字就出错。再比较一下Test文件,Query的生成方法不一样,TermQuery似乎是单元搜索,不支持词搜索,换成了QueryParser,成功了。但是还有一个小问题,比如搜索“中华”,在文章里,在中和华中间随便加多少空格和回车都没有关系,照样可以搜索到。但是加入其它字或者英文字母以后就搜索不到了。这个影响不大,毕竟人们常用的搜索都是自然词。

有了PyLucene这个好东西,心头一块大石头算是落地了。没想到,等到要在开发服务器的Linux上安装这个东西的时候,可费了功夫了。

官方的下载包做的很奇怪,ubuntu, debian, gentoo都有对应的二进制包可用,但是Redhat就没有,只能用源码包编译,而它的编译方式又做的极其简陋,没有configure文件,只有Makefile。按照说明,需要自己编辑Makefile,去掉你需要的注释行,修改参数,然后直接Make。但是里面有一个对DB的引用,检查了一下,BerkeleyDB似乎在CentOS4里面没有,只好自己去官方网站下载了4.4.20的源码,先编译安装它。虽然最新版是4.5.20,但是怕不兼容,所以还是用它配置文件里推荐的这个。编译这个东西也挺奇怪,不过还好,毕竟有官方文档一步步的说明,解压后需要进入build_unix目录,然后调用../dist/configure来配置,然后make && make install。指定prefix失败。装完了这个东西,再改PyLucene的配置文件,根据生成的错误消息猜了好几次才终于可以编译了。最终需要改的地方为:

1、取消Linux那一段的注释。

2、PREFIX_PYTHON是你的Python的目录。因为我的Python是自己编译安装的,所以这里需要改一下。

3、DB=这个我指向了BerkeleyDB的源码目录才通过编译的(还好没删)。

其它的不用改。编译到一半报错,有一个libgcj.a文件找不到,到/usr/lib下找了一下没有这个文件,但是有个差不多的.so,于是做了个ln -s,居然就通过编译了。然后make install的时候又有问题,提示libgcc_s.so.1找不到,这个是Makefile里面的LIB_INSTALL参数指定的,我不知道它的意义在哪里,最后我也没找到这个文件,但是直接进入Sample目录运行了一下测试文件,居然就成功了。真TMD。这就是Linux吗?

终于可以安心的研究Django了。似乎Ruby On Rails还没有支持中文全文检索的模块吧?