posts - 12, comments - 3, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

轻量级搜索框架

先介绍一下工具吧:

Sphinx :Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。Sphinx特别为一些脚本语言设计搜索API接口,如PHP,Python,Perl,Ruby等,同时为MySQL也设计了一个存储引擎插件。

 

下载方式:http://www.sphinxsearch.com/

基于sphinx的coreseek:http://www.coreseek.cn/

中文分词工具:LibMMSeg:http://www.coreseek.cn/opensource/mmseg/

 

tokyocabinet:在我第一篇博客有详细介绍。

mysql:大家都熟悉的开源数据库。

 

这个轻量级框架,保守估计,可以支持5线程同时并发搜索,根据我自己测试的结果,tokyocabinet(下称tc )FIFO队列返回10w条数据,只需要10ms,100w条数据要100ms左右。tc的key-value方式缓存,保守估计,100w条数据100ms没问题。

 

 介绍一下流程主要部分吧(看图流程,比较像张宴的“亿万级搜索框架”,老实说当时我看过,只是表面了解一下 | 恕我冒犯,大师级的东东我不是很懂,图片漂亮,但是内部实现,根本是比较模糊的,算是一半原创吧,哈哈)。

 

1、程序入口会判断用户输入的关键字是否有关键字缓存,如果不存在,就会调用sphinx对mysql数据库进行全文检索。

然后sphinx会吧搜索索引的文档id结果缓存到tc。

我故意把数据库的文本结果缓存到FiFo队列。因为sphinx是不会做文本索引的,所以它返回的知识搜索索引的文档id,也就是数据库主键id(或用户自定义ID),程序必须要吧结果id放到数据库搜索,吧文本结果取出来。虽然mysql根据id返回搜索结果的速度很快,(如果单用int类型id以递增方式查询mysql数据库,每秒可处理1000w数据)。但实际不会这么用。所以文本结果缓存就显得格外重要了。

最后通过FIFO队列,把相同关键字的搜索结果返回到页面现实。

 

2、当然,如何关键字缓存存在,就会直接从FIFO队列返回搜索结果。

 

我的想法:

因为知道sphinx的缺陷,所以想尽办法弥补,一个基于mysql的全文检索工具,速度之快,很是让人佩服。

 

问题总结:

1、简单统计: 用了tc缓存,其实有很大一部分原因是用来做统计。很多搜索引擎,都是用mencache,但是mencache是建立在内存上面的,不释放的话,资源消耗颇大。而tc就不一样,它是写入文本的,缓存数据得以保存。在做简单统计的时候,比如说:

统计"java" 跟"C语言"的用户搜索情况,我可以从tc中读出关键词缓存,知道搜索密度情况。

 

2、完成复杂统计: 复杂统计的话,必须要定义好,复杂的sql语句,要用到left join这样那样的函数,配置比较麻烦。但问题依然可以解决。(说是这么说,但是具体怎么做头绪还差一丁点~~牵扯到多表查询,性能如何还是要尝试尝试~)

 

希望看过文章的可以给点意见,我努力完善,献丑啦~~


文章来源:http://henry2009.javaeye.com/blog/465834(我的旧博客)

只有注册用户登录后才能发表评论。


网站导航: