商品搜索架构介绍

1,需求分析

伍哥所在的豆荚商城是一个家电行业的B2C网上零售平台。作为这样一个平台,自然少不了一个强大而且快速的商品搜索功能啦。这个搜索的功能最基本的 一个需求,就是必须能够根据用户输入的搜索关键词,返回相关的结果,而且相关度越高的结果应该排的越靠前。所以一般的数据库查询,比如like,就无法满 足这样的需求了。第二个基本的需求是快速,一个查询总不能让用户等几秒才出结果吧,那样用户早不耐烦跑啦。

2,搜索架构分析

基于以上两个基本的要求,经过方案的比对,最后定了使用sphinx(狮身人面像!)来做这个搜索子系统。其实sphinx本身也提供了两种常用的架构方式:一种是常规api查询的方式,一种是通过在mysql里面添加sphinxse引擎来实现。

2.1 常规api查询的方式:


第一步,是sphinx通过indexer索引工具对mysql相应的数据表做索引。由于我们的是中文数据,所以也使用了mmseg这个中文分词工具来配合sphinx建立索引。

第二步,是php程序通过php版本的sphinx api,向sphinx发送查询请求(具体是searchd这个进程)。如果查询到结果,就会返回相应结果数组,包含了id、相关度权重、相关的一些属性信息等等。

第三步,是php程序利用返回的结果,主要是id,向db查询详细的信息。比如查询商品的名称、价格、图片等等。然后就把结果加到页面上面来。

 

2.2 sphinxse引擎查询方式:


第一步,是sphinx通过indexer索引工具对mysql相应的数据表做索引。由于我们的是中文数据,所以也使用了mmseg这个中文分词工具来配合sphinx建立索引。

第二步,是php程序通过构造特别的sql,向sphinx se发送查询请求。

第三步,是sphinx se向sphinx发送查询请求(具体是searchd这个进程),获得id等等信息

第四步,mysql利用返回的id信息,结合sql,向php返回mysql结果集

 

2.3 两种方式的比较:

第一种方式是灵活,以后的扩展性好,但是PHP开发量稍大,而且要求对sphinx有比较深入的理解,特别是匹配模式、排序模式、评分模式、filter的使用和api方法。

第二种方式是php端开发简单,但是灵活性稍显不足。

出于以后的长远考虑,最后决定了使用第一种:api查询方式。

 

3,搜索子系统的实现 (简单介绍,具体实现不展开)

搜索子系统的实现其实分成两块,一块是client端的开发,主要是PHP开发工程师的工作;另一块server端的部署和开发,主要是运维工程师的工作。

Client端,先把子系统基本的MVC搭一下,然后把sphinx api封装成系统的分布式服务接口,接下来就是PHP开发工程师们的活了:学习API,在测试环境做练习,实际进行代码开发,单元测试和调优等等。

Server端,先是把sphinx部署好,然后是做索引部分。这是大头,也十分的重要。需要结合产品需求文档,结合数据库表结构,定义清楚文本字段、属性等等,要构造主索引和增量索引,以及索引更新的规则。最后通过search这个工具进行调优。

更进一步的话,要改善搜索质量,需要研究中文分词和mmseg,提高分词的准确度等等。

开发和运维的工作都完成以后,两端就做集成测试,基本完成以后,提交内部测试,进一步优化使用体验。最后就部署上线,打完收工。

全文结束。