欧亿在线注册_电商搜索引擎的架构设计和性能优化
文章择要:
电商搜索引擎的特点
众所周知,标准的搜索引擎重要分成三个大的部分,第一步是爬虫体系,第二步是数据分析,第三步才是检索效果。
...
电商搜索引擎的特点
众所周知,标准的搜索引擎重要分成三个大的部分,第一步是爬虫体系,第二步是数据分析,第三步才是检索效果。
首先,电商的搜索引擎并没有爬虫体系,由于所有的数据都是结构化的,一样平常都是微软的数据库或者 Oracle 的数据库,所以不用像百度一样用「爬虫」去赓续去别的网站找内容,当然,电商其实也有本身的「爬虫」体系,一样平常都是抓取友商的价格,再对本身进行调整。
第二点,就是电商搜索引擎的过滤功能其实比搜索功能要常用。甚至大于搜索自己。什么是过滤功能?一样平常我们网站买东西的时候,搜了一个关健词,比如尿不湿,然后所有相干品牌或者其他分类的选择就会呈如今我们面前。对百度而言,搜什么词就是什么词,假如是消息的话,可能在时间上会有一个过滤的选项。
第三点,电商搜索引擎支撑各种维度的排序,包括支撑好评、销量、评论、价格等属性的排序。而且对数据的实时性的要求特别很是高。对一样平常的搜索引擎,只有特别很是紧张的网站,比如一些重量级的门户网站,百度的收录是特别很是快的,但是对那些流量很小的网站,可能一个月才会爬一次。电商搜索对数据的实时性要求重要表现在价格和库存两个方面。
电商搜索引擎另一个特点就是不能丢品,比如我们在淘宝、天猫开了个店铺,然后好不容易搞了一次运动,但是却搜不到了,这是无法忍受的。除此之外,电商搜索引擎与保举体系和广告体系是相互融合的,由于搜素引擎对流量的贡献是最大的,所以大家都盼望把广告体系能跟其融合。当然,还有一点特别很是紧张,就是要保证绝对的高可用,而且不能宕机。
电商搜索引擎的架构
由于电商搜索引跟一样平常的搜索引擎区别很大,所以在架构的设计上也独具特色。
首先,搜索引擎的实现体例有许多种,有谷歌、百度、搜狗这种特别很是大的公司营销策划公司北京网络公司,也有京东、淘宝、当当如许的电商搜索引擎,许多中小型的电商可能更喜好用一个开源的搜索引擎。所以总的来说,重要包括以下这几种体例:
第一种是「Lucene+本身封装」,只用来做检索,然后封装,后面所有的 ES,这两个是完备的解决方案,而且包括索引所有的东西,只必要部署好营业逻辑,然后查找效果就可以了。
第二种就是 Solr,这是一个高性能,采用 Java5 开发,基于 Lucene 的全文搜索服务器。同时对其进行了扩展,提供了比 Lucene 更为雄厚的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完美的功能管理界面,是一款特别很是良好的全文搜索引擎。
第三种是 ElasticSearch,这是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful web 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 允许条目下的开放源码发布,目前使用的也特别很是多。
这里提一下,当当的搜索引擎是本身实现的,。如今,新兴的互联网公司大部分都是使用第一种或者第二种,数据量比较大的一样平常采用第三种。
电商搜索引擎标配模块
接下来我想讲一下,假如我们本身做一个搜索引擎的话必要实现哪些功能(上图是电商搜索引擎的标准模块),其实不止是电商搜索引擎,除了通搜的搜索引擎,其他的搜索引擎也是使用如许的标配。
对检索模块而言,首先是对用户的意图进行分析,根据用户的搜索词来进行纯算法的实现。比如用户的搜索词是「黑包包」,其实用户的本意就是买一个黑色的包,但是这个「包」可以跟别的词组合在一路,甚至在搜索效果中会出现「包子」。所以,这就必要 query 分析体系来做,告诉检索体系,你必要重要在服装鞋帽中的分类去找,而不是生鲜食品类。
设计到技术层面,当当网使用的是 C++。假如构建一个性能好的体系,一些老一点的公司德龙驾驶室,大家都是在使用 C++ 或者是 C 语言。不止是当当网,其实许多公司都是使用的 C 或者 C++ 实现的搜索引擎。
数据更新模块
第二个模块就是数据更新模块,该模块负责生成索引。而数据中间模块重要做的事情,就是将原始的结构化数据,变成一个可供检索体系使用的搜索数据库。当然,数据更新模块和检索模块是分开照旧合并呢?其实从本质上讲,都是一堆代码,完全可以写在一个进程里。当然,也可以分开,通过网络往外输入,各自都有道理。第一种是简单粗暴型的,假如是通俗电商,像生鲜电商,数据量不大,实时性、季节性很强,就可以把两个体系用一个进程来完成。但是假如到了百万、万万甚至上亿级别的话,就不可能部在一台机器上了。
上图就是当两个体系合并在一路的时候,红色部分就是检索体系,黄色部分是上游产生数据的体系,假如是淘宝的话,对接就是淘宝的商户,当当网对接是市场部的人员,他们将数据录入体系,推到数据库,然后向下进行传送,最终建立一个索引。
上图中的蓝色部分就是营业逻辑,由于电商的搜索引擎营业需求量特别很是高,尤其是如今大家都喜好用手机进行购物,像手机专享价就是一个新的营业,这也意味着必要一个专用的模块来处理这些商用的逻辑。
此外,就是用户举动的分析,我们搜集到的日志还有其他相干的数据都会存到 Hadoop 集群上去,通过离线计算,然后传给商业模块或者排序模块进行排序和打分,并提供应用户更好的使用体验。
出题目是不可避免的!如何解决?
虽然整顿来看,设计的思路是特别很是合理的,但是照旧会出现题目。一样平常而言,一个成熟的电商搜索体系,它的题目都很集中,要这几种情况:首先就是 Bug,当然这是所有体系都会碰到的题目;第二个就是并发,但是搜索体系是没办法进行分库分表,所以能做的就是索引切分;最后一点就是监控,包括题目追踪、日志体系和监控体系,那么为了解决这些题目,我们应该怎么做?
首先,针对 Bug 题目,只能靠主动化运维去解决(这里也保举使用 OneAPM 工具);第二个就是高并发的题目,目前重要是靠缓存和横向扩展。而缓存和横向扩展怎么应用到体系中去,这个很关键。许多人也说可以换一种语言,比如讲 Python 换成 C++,但现实情况下,换语言并不能解决并发的题目,好的数据结构的设计比换一种语言更能进步性能,所以一样平常解决高并发题目的也就是缓存和横向扩展。
第三个就是使用用 FLUME 日志体系(Flume 是 Cloudera 提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的体系,Flume 支撑在日志体系中定制各类数据发送方,用于收集数据;同时,Flume 提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力)。其实,Flume 会把集群上每一个节点的日志全都收集起来,如许做起来有两个益处,第一是现场出题目,可以先回滚出 Bug,然后进行查询。第二个就是对日志进行搜集,然后做用户举动分析,查看用户点击了多少次,从何处导入的流量等等,从而便于更好的进行排序。
然后讲一下缓存的题目。一样平常搜索的缓存可能分为两级缓存,据我观察,像搜狗可能是使用页面级缓存,而百度可能用的是索引级的缓存。比如在搜狗搜索一个词,开始时可能必要 40 毫秒,然后再搜的话,就可能一会儿降到 1 毫秒。这就是页面级缓存。而百度可能第一次搜索用了 40 毫秒,第二次就是 25 毫秒,它并不是把页面给缓存下来,而是将索引的倒排链缓存,级别其实是不一样的。
电商搜索许多使用的是两级缓存,对于分外热门的词汇,我们可以做页面级缓存,而页面级缓存的时间只有 15 秒到 20 秒。但是像价格如许的东西不能缓存,必要前台页面去反拉价格。第二级就是索引级别的缓存,现实上也是自建的一个缓存体系。另外,排序也有缓存,由于排序的效果不太会有太大的转变。
上图是当当的搜索架构,这里有一个集群是做数据分析的,上面备满了数据。
首先,集群之间采用什么样的通信体例?我们重要使用 ZMQ(这是一个简单好用的传输层,像框架一样的一个 socket library,使得 Socket 编程更加简单、简洁和性能更高。是一个新闻处理队列库,可在多个线程、内核和主机盒之间弹性伸缩)。缘故原由其实只有一个,就是快,特别很是快,比较适合数据量比较大的营业。
如何避免冷启动?
最后就是冷启动的题目,这个题目是许多电商网站都很头疼的题目。尤其是随着电商网站的商品数量达到肯定量级的时候,比如已经上亿了,像淘宝、天猫的话应该更多。假如重修了一次索引必要启动,或者新上线了一个营业模块,必要重启体系,是很麻烦的。
当然,当集群大了以后有许多方法,比如分开启动之类的,至于技术嘛,一样平常索引的加载都是使用 Lunix 标准的 MMAP(MMAP 将一个文件或者其它对象映射进内存。文件被映射到多个页上,假如文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。MMAP 在用户空间映射调用体系中作用很大),如许启动速度会很快,但是体系会有预热时间,前面一些时间的查询会比较慢
假如数据量不是分外大的话,而且如今内存也那么便宜,完全可以将数据一次性读入内存,由于 mmap 的操作毕竟性能没有直接内存来得快。
第三种的话,就是尽量削减做全量数据的频率,避免整个体系的重启,这必要定期做一下索引的优化,把没用的索引干掉。
假如是新上了一个营业模块必要重启集群,如许的事情最好不要发生,这就是架构有题目了,将营业模块变成外部的模块或者插件进行上线才是精确的,不然每上线一个模块必要重启集群,这谁都受不了。
北京搬家