Posted on 2009-09-30 00:11
创意恒动力 阅读(1060)
评论(0) 编辑 收藏
先介绍一下工具吧:
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(我的旧博客)