[半技术]为聊天记录查看增加了搜索功能

2009年06月24日 14:43

我们的BT群原先一直是使用Google talk服务器的,但是前一段时间不知道怎么回事,非常不稳定,经常漏消息。在忍无可忍的情况下,我自己搭建了Jabber服务器,改造了群机器人,让它挂接到自己的服务器上,并且让大家都加入了新的群。消息侧漏的问题终于得到了解决。

凡事有得必有失。自己DIY有足够的自由度,但是却缺少了很多支持服务。比如原来用GTalk服务器的时候,聊天记录会由gmail自动提供(还附带有很强大方便的搜索功能),而自己搭建服务器之后,这个便利就没有了。为了方便大家,我用pylons写了一个很简单的聊天记录查看的功能,算是解决了一部分的问题。

但是没多久问题就来了,以前大家可以在gmail里方便的搜索以前的信息,但是我的聊天记录查看并没有提供搜索的功能,所以很多以前聊过的话题想回顾就比较麻烦。我自己也感觉到了不便。于是在前一段时间的忙碌之后,我抽了几天的空,完成了聊天记录的搜索功能。

本来想好好研究一下写一点东西的,不过现在工作越来越忙,已经不太有精力去做细致的研究了。所以我想还是写一点半技术的话题,算是给需要的人抛砖引玉吧。

这次我采用的是一个纯Python的搜索框架Whoosh。原来是想用更著名的Lucene的(我还曾经买过一本Lucene In Action的书,本来想正好用上的),不过Lucene跟Python的结合非常困难。确实有一个pylucene的方案,但它是使用代码生成器生成python接口然后使用的,使用部署上的繁琐且不去说它,这还使得很多针对Lucene的中文分词库无法使用。这一点很麻烦。为了避免麻烦,另外考虑到我的程序规模不是很大,所以还是选用了一个纯python的框架。从我找到的评论来看,Whoosh的性能在纯python的框架中还是比较出色的。

总的来说,Whoosh不是一个知名的框架,因此对它的支持也就少得可怜。在中文搜索世界非常重要的中文分词,就得我自己来解决了。我在网上找了一个开源的中文分词库:pymmseg-cpp,它是一个C++的实现,然后做了一层Python封装,效率还可以,接口也算简洁。我依据这个分词库,写了一个用于Whoosh的中文分词分析器:ChineseAnaylzer,然后将这个分析器挂接到框架中,就可以使用了。另外要提一句,pymmseg-cpp似乎是基于字典的,它自带的那个分词字典不太好用,我从网上重新找了一个比较完整的分词字典,用脚本整理成了它需要的格式,替换掉了它原来那个,然后就感觉好多了。

因为Whoosh没有默认提供,我还自己写了一个highlighter,用于以HTML格式高亮显示搜索到的结果片段。

剩余的部分基本上采用Whoosh提供的示例代码就可以搞定了。

另外,部署的时候,因为indexer和searcher的运行环境不同,还要考虑路径的问题。尤其是自己实现的几个模块的路径问题。我的解决方法比较简单,就是把自己实现的模块及其依赖都扔到virtualenv的site-package里(用softlink的形式),这样就不怕加载不到了。当然这不是一个干净的解决方法。

另外为了提高index的效率,我为indexer实现了增量索引的功能,然后使用crontab每隔几分钟索引一次。以确保最新的内容能及时被搜索到。

现在这个搜索功能基本上可用了,大家反映暂时还不错。

当然因为时间的缘故,里面还是用了一些不干净的做法,也算是理想和现实的冲突吧。

最后我想提一句,很多人说到搜索,大概会立刻想到搜索框架。其实对于一些小型的应用,是可以找到一些更加简单的方法的,比如Linux提供的grep,对于文本的搜索还是挺不错的。实际上我确实想过这个方案(我的这个应用完全是对文本文件的操作,跟数据库无关),不过这一次为了接触一下真正的搜索框架,而没有采用。事实上我觉得对于我们这样的纯文本应用,grep完全是可以考虑的。至于语法的部分,实现一个QueryParser做一下转换,应该可以解决大部分的问题。

5条评论

gravatar for 猛禽
囧,我还真没想到可以用GREP来干这事。 猛禽 (Email) (URL) - 2009年06月24日 15:21

gravatar for 令狐虫
要不要哪天我写个demo给你看看?呵呵 令狐虫 (Email) (URL) - 2009年06月24日 16:55

gravatar for Moyan
几乎翻遍了整个互联网,就您这里有关于中文的Woosh使用文字了。

想偷个懒,可否share出你的mmseg中文字典文件
以及ChineseAnaylzer代码?
多谢 Moyan - 2009年08月31日 00:21

gravatar for 令狐虫
呵呵,貌似我都找一些非主流的东西来用。自己折腾自己啊。 令狐虫 (Email) (URL) - 2009年08月31日 10:45

gravatar for lider
博主啊,能否share下你的ChineseAnaylzer。能力有限,学习下。 lider (Email) - 2011年12月01日 22:23




Remember personal info?
Notify
Hide email
Small print: All html tags except <b> and <i> will be removed from your comment. You can make links by just typing the url or mail-address.
Design downloaded from free website templates.