用MySQL全文索引给FeedDB打造一个搜索引擎

效果图,欢迎测试 http://feed.readself.com/

samhjn  同学在上一篇文章评论中表示 Feed Database 的搜索功能不好使。原因是之前我没有太注重搜索上的优化,所以这个功能的体验很差。例如输入 “xiaoxia” 结果搜出一大堆 “xiaoxiao” 的网站,排名还比我的博客靠前,挺失望的!不过,今天的工作就是把这个功能给完善了!现在已经不是之前那个单纯在MySQL里使用like ‘%keyword%’查找那么简陋了。而且搜索速度也大大提升,不再像之前那样慢。

只要你输入关键字“xiaoxia”进行搜索,绝对不会出现“xiaoxiao”的结果了,因为这是两个不同的名字。

 

同时,你输入的关键词还会被拆分,例如“吸血鬼小说”会被拆分成“吸血鬼”和“小说”。排序方式为先按匹配词数,再按BR值(被友情链接数量)排序。

 

提到搜索引擎技术就离不开分词和索引,在分词上,我使用的是 mmseg 的中文分算法和搜狗的词库,分词速度快的惊人。以至于我处理数据的瓶颈在MySQL数据库上。我使用了MySQL的fulltext索引功能,在检索效率上可能没有sphinx那么快,但是对于10万个条目以内的数据库,速度已经足够了。为了达到精确查找的目的,我只对网站链接和标题两个属性进行了索引,fulltext的索引数据占用的空间也不多,才不到10M,挺环保的。

对网站标题进行分词之后,连同需要建立索引的链接,一起搬到了一个叫feed_index的索引表中。

下面是未分词的一段数据:

分词之后的数据:

目前这个分词效果还是挺满意的。另外,在最近看的一本搜索引擎相关的书籍中,提到了一种不依赖于词库的分词方法,能够应付一些新生的词汇,有空研究一下。如果两种方法都结合起来,应该能够达到更好的效果 🙂

夜已深,明天继续研究!

用MySQL全文索引给FeedDB打造一个搜索引擎》有41个想法

  1. samhjn

    如何确保检测出来的服务器程序是正确的?
    有一些人为了避免攻击,会对服务器信息做更改,这样测出来的是 nginx 它本身却很可能是 Apache

    回复
    1. Xiaoxia 文章作者

      这个很难说,得到的服务器版本信息不一定是正确的。有少数可能是伪造的。

      其实我也是用来做统计作用,总体上统计数据还是准确的,毕竟伪造服务器信息的人不是大部分。

      回复
  2. lijiejie

    囧。。。我只用了like ‘%word%’…
    看完你的分词和索引,甚感强大无比啊。

    稍后你再对搜索功能进一步优化,完全就是一个搜索引擎了!

    回复
    1. Xiaoxia 文章作者

      分词和索引都有现成的库,这也已经不算是一种新鲜的技术了。
      我只是学习了一下原理,然后直接涌上来。

      说到优化,还有很多地方需要优化的,最大的问题就是性能和并发搜索能力。

      回复
    2. excerpt

      “稍后你再对搜索功能进一步优化,完全就是一个搜索引擎了!”
      然后若干年后就诞生了这么一个产品http://www.google.com/blogsearch

      回复
      1. Xiaoxia 文章作者

        哇!!!
        你怎么知道我要做这个的呢???
        其实我还想做codesearch,只不过还没开始这样的打算。

        回复
    1. Xiaoxia 文章作者

      o(∩∩)o…哈哈,这个真的需要一个高配置的机器了。
      目前在我的现在用的VPS是跑不起webkit的内核啦!

      回复
    1. Xiaoxia 文章作者

      你这提议很好啊!于是我真的把路径算了一下:

      http://feed.readself.com/path/38f3b45ce3e379bb905ef4daf492f7419d938de9

      LV(0) http://xiaoxia.org Xiaoxia[PG]
      LV(1) http://www.lijiejie.com 李劼杰的博客
      LV(2) http://www.rrgod.com/ Eddy Blog – 关注软件加密解密技术交流和材料科学发展的科技博客
      LV(3) http://www.programlife.net/ 程序人生-代码疯子的技术博客-Www.ProgramLife.Net
      LV(4) http://shaoyimin.com/ Yimin Shao – 邵逸民
      LV(5) http://flashlab.info 饮水·思源 | flash,心情,手机web

      回复
    1. Xiaoxia 文章作者

      嗯,这个是实时算出来的,之前的版本有bug,现在好了。
      之前在limit之前算level,结果搜索结果一大,就悲剧了,现在在limit之后,才算level,速度好起来了。

      回复
    1. Xiaoxia 文章作者

      哇!!!被你发现bug了!!!
      不过,个人觉得tornado server应该能克服这种问题。也就是说,你输了一个无限大的地址,服务器会持续给你发送数据。
      但是应该不会导致服务器崩溃。因为tornado是单线程异步的。

      谢谢,稍候修复这个问题 🙂

      回复
        1. Xiaoxia 文章作者

          刚刚也发现了这个问题,现在好了。。。是因为burst.net的vps被重启了,服务没有运行。。。

          回复
            1. Xiaoxia 文章作者

              还好吧。。。我博客的vps已经5个月没有重启过了,还算稳定。过段时间我可能把feed.readself.com的VPS换成xen的。

              回复
        1. Xiaoxia 文章作者

          这个我也是第一次写,在积累经验截断。
          还没看什么资料,不过我觉得需要掌握一下HTTP协议和HTML。

          回复
  3. Pingback引用通告: Thought this was cool: 用MySQL全文索引给FeedDB打造一个搜索引擎 « CWYAlpha

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据