搜索引擎的多重分词算法及分词词典更新时对索引的重新生成的简单想法
由于最近的项目中需要用到搜索引擎,由于之前采用的是mysql数据库,而且在对索引没什么要求的情况下,就直接采用的mysql的fulltext索引.
不过最近开始考虑到尝试新技术和对系统性能的担心,在系统中引入redis(一个性能及功能都十分强劲的NoSQL数据库),来承担一部分比较适合NoSQL数据库做的工作,如排行榜/关注列表等.
恰恰不小心看到redis的一个做搜索引擎的非常简单的思路(英文索引,参考:http://playnice.ly/blog/2010/05/05/a-fast-fuzzy-full-text-index-using-redis/),便留意起了在redis上实现一套简单的中文搜索引擎.
说道做搜索引擎就不得不提到两点十分关键的内容:一是分词,就是将一个句子拆成不同的词和字;二是索引(及排行),用于快速的定位到需要的内容.
在这里主要讲下我对分词和简单索引建立的一点思路:
分词方面
分词有现成的工具可以用 scws,一个中文分词系统,可以作为php扩展,自带的词库就有28W词量,准确率高达95%.
不过分词有一个很大的不确定性,比如说”魔兽争霸”这个词,它可以作为一个单独的词表示一款游戏,但是很多人把它直接简称为”魔兽”,这就导致了在分词的时候,必须将”魔兽争霸”分为不同的单词组合如(“魔兽争霸”)和(“魔兽”,”争霸”)这两种可能,而这这就意味着必须进行两次分词,来保证搜索结果的准确性.感谢scws的作者hightman,他已经实现了不同级别的分词算法,我们用起来就简单很多了.
索引重新建立方面
比如我之前不知道有”魔兽争霸”这么个词,然后很利索地把它给拆成了”魔兽”和”争霸”,于是乎我搜”魔兽争霸”的结果很有可能是”魔兽们平时都以争霸为乐趣”,这显然有点不靠谱.因此当我知道一个新的词的时候,需要对原有的索引进行一次重构,将原先即包含”魔兽”也包含”争霸”的句子提取出来,判断是否包含词组”魔兽争霸”,然后丢到索引”魔兽争霸”里面.