项目中的搜索模块

项目结束也好久了,还未总结过项目中用到的技术、思想及原理,今天闲来无事,就把项目中的搜索模块总结一把,此搜索模块是从美丽说的搜索模块总结出来的,然后运用到了项目当中,没什么高深的原理,大牛们可以略过。

此搜索模块的原理总结为一句话就是:把原本应该在查询时候执行的业务逻辑给提前到插入的时候执行,这样的话提高了查询效率但降低了插入效率

废话少说,开始…

搜索模块大致有这么几个核心表:模糊关键字(ShareWord表)、系统关键字(ShareKeyWord表)、系统关键字与模糊关键字的中间表(ShareKeyWordMapping表),这三张表中的数据都是由网站管理员进行插入并配置好表间关系的,那么这几个表中有了数据之后就可以开始我们的搜索。

搜索的基础:模糊关键字表(ShareWord表)中的数据就是不规则的,模糊的,不经常用的,系统关键字是规则的,经常用的,比如“呢大衣”就是系统关键字,而“尼衣”或“尼”就是模糊关键字,最终是要把“呢大衣”与“尼衣”、“尼”匹配起来,类似与全文检索中的分词搜索(Lucene.Net+盘古分词),类似与这样的数据就插入到了ShareWord表、ShareKeyWord表、ShareKeyWordMapping表,这样就有了搜索的数据基础。

 

搜索模块用户操作流程是这样的,用户输入淘宝商品链接,系统根据链接获取商品信息,之后要经过这么四个步骤:

1.插入该商品到ShareItem表中,获取该ShareItem的Id,第4步要用到这个Id

2.在模糊关键字表(ShareWord)中找到该宝贝标题对应的所有模糊关键字(用like);

3.根据模糊关键字匹配表(ShareKeyWordMapping)找到所有的系统关键字(同样是like),找到所有的系统关键字后由于可能是重复的,所以需要Distinct一把;

4.把该商品的Id和匹配到的所有的系统关键字(Distinct后的)的Id插入到ShareItemKeyWord表;

经过这么四个步骤商品(ShareItem表)和ShareKeyWord表就有了关系,关系表为ShareItemKeyWord表。

到此商品插入完毕,接下来是搜索的实现…

搜索就看起来非常简单了,直接在ShareKeyWord表中like 网站管理员已经配置好的keyword_name ,获取到所有的keyword_id,链接ShareItemKeyWord表获取所有的item_id,也就获取到了所有的ShareItem,搜索模块完毕。

总结:

把原本应该Like所有ShareItem的title的工作变为只like网站管理员已经提前配置好的系统关键字,然后根据系统关键字与ShareItem的匹配表获取所有的ShareItem的Id,进而获得所有的ShareItem,通过降低插入效率来提高查询效率这一思想同Lucene.Net的原理大致相同。依据这个原理,我们还可以进行扩展,比如可以加入商品分类、商品专辑等,原理都一样,在这里就不一一列举了,请各位看官见谅。

以下是数据库简要设计截图。

posted @ 2013-12-02 21:25  猴子hhj  阅读(1356)  评论(0编辑  收藏  举报