怎么实现站内搜索
的有关信息介绍如下:之前学过一点点关于全文检索相关的技术,当时使用的是Java语言,Lucene和compass框架。然后现在用的是Python了,所以需要迭代一下。网上搜索了下,相关的还真不少,还有pylucene,但是相比较而言,whoosh更为出色。那今天就用它吧。
模块化
最近越来越喜欢把任务模块化了,这样单个的功能也比较容易管理,而且整合的时候对集成测试也比较方便。或者添加新功能,重构,都很方便。
针对上面的需求,我这里设计了几个小模块,待会逐个进行解释。
登录模块
登录模块是有点必须的,这是因为在获取博客详细内容的时候,需要有一个已经登录的session会话来支撑,否则拿不到数据。
先前也写过一点关于CSDN模拟登陆的例子,当时完成的功能有
模拟登陆
顶、踩文章
发评论
获取博主详情
为了不让别有用心的人拿代码做坏事,我这里就不贴代码了。技术方面欢迎私信,或者在文章下面发评论。
下面把模拟登陆的代码补上。
博客扫描模块
博客扫描这个模块不需要登录状态的支持,完成的功能是扫描博主的文章总数,以及每个文章对应的URL链接。因为接下来会用它来获取文章的详情。
博客详情模块
关于博客详情,我倒是觉得CSDN做的真不赖。而且是json格式的。话不多说,看下登录状态下能获取到的博客的详细内容吧。
这下思路很清晰了,就是要获取标题,URL,标签,摘要描述, 文章正文内容。代码如下:
搜索模块
搜索模块是今天的核心,使用到的库就是whoosh, 真的是很贴心的一个库,而且文档详细,简单易懂。我这蹩脚的英文水平都可以,你也一定可以的。
默认的文本分析器是英文的,所以为了更好的照顾到中文相关,就得处理一下中文分词,于是在网上抄了一个,不过效果不咋地。
演示
好了,差不多就是这样了。下面来看下运行的效果。
案例一
首先看下对于DBHelper这个关键字的搜索, 因为文章过多的话计算也是比较慢的,所以就爬取前几篇文章好了。
不难发现,本人博客只有前两篇是关于DBHelper的文章,所以命中了这两个document。看起来还不错。
总结
最后来总结下。关于whoosh站内搜索的问题, 要向更高精度的匹配到文本结果,其实还需要很多地方优化。QueryParser 这块其实还有很多需要挖掘。
另外高亮显示查找结果也是很方便的。官方文档上有详细的介绍。
最后一步就是中文问题,目前我还没有什么好的办法来提高分词和命中率。