项目结束也很久了,还未总结过项目中用到的技术、思想及原理,今天闲来无事,就把项目中的搜索模块总结一把,此搜索模块是从美丽说的搜索模块总结出来的,而后运用到了项目当中,没什么高深的原理,大牛们能够略过。数据库
此搜索模块的原理总结为一句话就是:把本来应该在查询时候执行的业务逻辑给提早到插入的时候执行,这样的话提升了查询效率但下降了插入效率。app
废话少说,开始…网站
搜索模块大体有这么几个核心表:模糊关键字(ShareWord表)、系统关键字(ShareKeyWord表)、系统关键字与模糊关键字的中间表(ShareKeyWordMapping表),这三张表中的数据都是由网站管理员进行插入并配置好表间关系的,那么这几个表中有了数据以后就能够开始咱们的搜索。设计
搜索的基础:模糊关键字表(ShareWord表)中的数据就是不规则的,模糊的,不常常用的,系统关键字是规则的,常常用的,好比“呢大衣”就是系统关键字,而“尼衣”或“尼”就是模糊关键字,最终是要把“呢大衣”与“尼衣”、“尼”匹配起来,相似与全文检索中的分词搜索(Lucene.Net+盘古分词),相似与这样的数据就插入到了ShareWord表、ShareKeyWord表、ShareKeyWordMapping表,这样就有了搜索的数据基础。blog
搜索模块用户操做流程是这样的,用户输入淘宝商品连接,系统根据连接获取商品信息,以后要通过这么四个步骤:it
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的原理大体相同。依据这个原理,咱们还能够进行扩展,好比能够加入商品分类、商品专辑等,原理都同样,在这里就不一一列举了,请各位看官见谅。
如下是数据库简要设计截图。