首页 > 电商资讯 > 阿里巴巴:电商场景下云搜索应用与实践
2016
01-17

阿里巴巴:电商场景下云搜索应用与实践

2016年1月8日,在由思路网主办的思路汇(北京站)——《电商场景化的用户体验》中,阿里巴巴开放搜索郑梅发表了题为:《电商场景下云搜索应用与实践》的公开演讲。并对在场观众的疑问作出了解答。

大家好。我是来自阿里巴巴开放搜索的郑梅,今天很高兴跟大家探索一些搜索的话题。

我今天介绍的分为三部,因为搜索是偏技术的话题,所以可能我介绍的也会稍微跟技术有关一些。刚才于倩也说大家是偏技术的,让我松了一口气。我们今天介绍一下搜索的知识以及电商场景下有哪些搜索的体验关键点。还有我们开放搜索会怎么去解决。

希望能够通过今天的话题,能让大家对于在电商场景下的搜索的主要思考方向和解决方案有一个大体了解。

首先,我们来看一下搜索。提到搜索,大家会想到哪些的场景。大部分人会想到百度或者是淘宝,但其实搜索可以做很多的事情。这里我简单列了几个。第一,最常见的就是百度和谷歌群网站类型的搜索。比如说搜索哪些网页里包含的某某内容。这是大家用处最广泛的。其次,电商场景下,我要搜索一些包含某某关键词的商品。还有,在O2O的场景下,很关键的是跟距离相关的,要搜距离最近的或者是几公里范围内的餐馆、药店,按距离做排序。还有一些是大家接触不太多的,但是电商广泛应用的数据分析。比卖家或者是买家的定单记录,浏览记录,我需要从里面分析出很多的有用价值。再就是类似于偏数据库的一些检索。

所以说,搜索的场景是非常多的。那我们接下来就来看一下搜索是怎么做的。

首先看一下搜索里面最重要的三个概念。就是倒排、正排和摘要。倒排就是我会构建,对于搜索来讲,一个网页或者是一个商品就是一条记录,这个记录我需要去搜索。你搜索的时候会构建一个倒排,意思是我会把关键词,每个文档里面有很多的关键词,比如说有一个关于羽绒服的商品,里面有关于羽绒服的很多描述。这个描述的信息可以分成很多的词组,比如说红色羽绒服分成红色和羽绒服。为了达到这个目的,会构建这个分词的一个词组,到文档的一个倒排列表。

另外一个正排,说的是我构建的是我的文档,文档里面包含了什么属性。比如说一个商品数据,除了标题、描述,还会包含销量,比如说包含品牌,包含它的一个型号或者是价格等等很多因素,在这里它也是构建了我有哪些文档里面的字段,以及字段的内容是什么。

还有一部分就是摘要,相当于描述。你搜索出来之后,都会展现给用户,应该展现哪些内容,这就是在你的摘要里面去定义的。

这个其实就是淘宝网里边的一个搜索的界面。我们可以看到,最主要的就是用户大部分的搜索入口都是通过搜索来做的,就是搜索框里输入一个羽绒服,这个羽绒服就是通过一个倒排的索引,接下来的是做过滤筛选,比如说我可以选择品牌,选择一些尺寸、款式等等。同时,你还可以做一些排序,比如说我按价格或按销量都是可以的。最后有一部分的展示,就是通过摘要来做展示。

我们接下来探讨一下,大家刚才了解了搜索包含哪些功能和部分,我们就可以想一下怎么算是一个好的电商产品。

有人愿意回答一下吗,在你心目中,你觉得什么算是一个好的电商产品?

互动者:可以快速找到想买的东西。

郑梅:对,这是概括起来的总目标。我们来想一下,在电商场景下,对于搜索是一个强依赖关系,不管是大家看到的一些淘宝还是我们后续介绍的一些从其他入口进来的,都是跟搜索有关系的。包括现在淘宝上你的搜索入口的流量也是占了总流量的绝大部分。

一个好的商品,一个好的电商产品应该具备哪些特性?第一,最重要的就是要有结果,而且结果要准确。你搜什么要给我一个什么样的商品,一个什么样的数据。其次,你给了我数据是一方面,另外我希望好的一些商品需要能排在前面,不能说让用户翻几十页才能拿到他想要的结果。再就是在一些综合性的这种平台性的场景下,可能会有很多比如说羽绒服这个案例会有很多的卖家都卖。我不能说有一个商家是卖羽绒服的,前一页、两页都是这个卖家的商品,所以说不能总出一个商家的商品,让大家有一个公平的机制在。还有一个,我还要支持一个多纬度的排序,就像我们看到前面的页面,我需要按销量、价格,按用户常规的一些每个人的需求,给他做排序。然后我还要按我希望的比如说品牌、尺寸、价格等等的,我要做一些统计或者是过滤的工作。以此来筛选我想要的商品。另外一个,这里提到一个我要能识别用户的一个意图。因为很多场景下,用户搜索或者是表达出来的实际上是带有这种语义的场景的。他说出来的跟他实际搜索是有区别的。所以说,一个好的电商产品能理解用户语义层级的意图。另外一个是最好能根据用户类型去给他展示不同的搜索结果。比如说一个女生搜索羽绒服,一个20岁的女生或者是跟一个40岁的女士搜索的结果肯定是不一样的。

基于这些,我们用搜索的一个稍微专业的语言讲,就是首先要保证搜索的召回率,这个要高。其次是相关性要好,我想要的东西一定要排在最前面。我之前是做百度的,百度的第一页的应该是占了,就是你往后翻页的会非常少,80%—90%都是留在第一页的,甚至80%的都是停留前三个。还有这就是一个商家的聚合打散。这是一个基本功能,不能保证一个商家的结果过于集中。再就是一个多维度的排序、过滤、统计,再就是支持下面这两个高的要求,就是支持用的智能搜索和千人千面的结果。现在淘宝主要的工作就是在这上面,就是千人千面。现在已经有一些成果了。你应该可以看到,你搜索的跟你老公或者是老婆搜索的很可能就不一样。

我们再来看一下,比如说搜索的场景下怎么做到这些呢。

这个就涉及到我们首先来看一下,我们的搜索当你在淘宝里面输入一个关键词的时候,它是怎么来执行的。我们来看一下查询的过程。比如说用户给了我一批数据,我首先会做语法分析。其次会去切词,用户输入可能会很长,羽绒服、韩版、女,或者带一些品牌,很长的词,所以要涉及到切词。其次就会涉及到一个查询分析的改写。这主要是为了做智能分析来用的,改写完之后会执行你的实际的查询。查询做完之后会做相关性的一个计算,你拿到结果之后我要来算分,制定你的排序结果。最后确定最终返回的文档之后,会到摘要,返回给用户。

我们先来看第一步,怎么做语法的解析。这是一个在我们开放搜索场景下支持的一些语法。细化出来就是我可以支持,我要搜索标题里面的羽绒服,品牌是波司登,价格是500—1000之间,我还要排序,这是按相关或者是按其他的价格去排,你可以自己定义。统计,你可以去按商家统计。比如说我要去看一下,因为这个是做数据分析的时候要用或者是商品展示的时候要用。我这个商品在某一个商家下有多少的结果。再就是这个,是用来做打散的,我要根据卖家的ID去打散。这个是分析,第一步会把用户发起的搜索到搜索后台里面的结果,一个查询的解析。

第二步就是分词。现在其实在开放搜索里面提供了很多的这种功能,或者是现有的搜索场景下需要做到这么多。然后,我们来看一下这个分词的重要性。不管是在电商场景还是其他的网站场景下,分词都是非常重要的,甚至是你除了相关性之外,分词是最终了。为什么谷歌跟百度在相同的网页内容情况下,结果还是不一样?主要是两部分:一是分词;二是相关的的排序结果。

我们来看分词的重要性。比如有人说我搜菊花茶是有结果的,我搜花茶就没有了。比如说有一个手机号是138XXXX,为什么输入138不出来,或者说一个imx的player,为什么输入player没有结果。比如说我按拼音为什么没有结果。另外一个是我的数据量非常多,用户量召回的条件太多,怎么办。或者是我的数据量比较少,搜出来的大部分没有结果怎么办。这些都是我们日常在各种各样用户的场景下碰到的最多的一类问题。就是我搜出来的结果跟预期不一样,这是为什么。就是因为你的分词配置不正确。现在其实我们会简单写了几种。现在我们在阿里云开放搜索力支持的分词的一个类型。

第一种,按语义分词。在语义场景下,全网站或者是一些带语义的场景下用得最多的。比如说按语义分词或者是扩展语义分词。比如说以菊花茶为例,这是有一个典型意义在的词汇。但是菊花和茶也是有一个典型意义的。菊花是一个单独的词,茶也是一个单独的词。还有一个扩展的词是花茶。所以说不同的层级是不一样的。我们说有一个倒文档的对应方式,如果你这个没有的话,就找不到数据,搜不出结果来。还有一个是在某些场景下是不需要带切词结果的,比如说波司登,我希望精确的。还有一些是在非语义场景下。比如说用户名,你要搜索一个用户,很多的用户起的比较乱,没有什么语义,你按语义分的话,没有结果。这样我们会提供一些非语义的场景,保证你的召回率,或者是非语义场景下可以按单词切。另外一个是相当于拼音或者是模糊的。这种是我有一些拼音的场景下,淘宝也是一样,输入的时候,用户最习惯的是输拼音,没有时间打字,或者是不知道哪个字,这时候就涉及到拼音搜索。或者是某一场景下搜索一个型号或者是手机号,这就涉及到模糊的搜索。当然还有一些英文的,这是针对于国外的,除了英文的话,还会支持日文、葡萄牙文之类的。还有一个是自定义的下面自己去切词,也是支持的。

这个我们刚才说了一下了,就是在不同的场景下,应该去选择不同的分词的一个类型。因为分词按照我们刚才提的,就是你的搜索结果效果的保证。你是不是有结果,效果是不是好,跟分词是密切相关的。这个我们就先过了。

拿到分词结果之后,这时候涉及到智能改写的功能。在电商场景下,这么几部分会起作用。比如说停用词。用户输了大量的口语,比如说商品怎么样,带一些助词或者是语义词,或者系非常常用的词。这时候我需要停用掉,这些词的存在会干扰到我的搜索结果。

另外一个是纠错。我写的是汉字,写错了,我需要有纠错的功能。不能说写错就没结果,这个也是非常不好的体验。

接下来就是一个同义词。同义词也是非常好理解的。比如说我输入一个KFC,你得知道我搜索的是肯德基,没有结果也是非常不好的体验。

这个词权中,有一些词是不重要的,我要给它降权,把中心词往前排。

再就是一个类目预测。用户搜索苹果,你怎么知道他输入的是Iphone的苹果还是水果的苹果,这个就涉及到类目预测。你要看他的往常搜索场景,他关注电子。如果这个用户来了之后,你把水果降权。但是针对于一个经常在超市买水果相关的东西的话,你应该出的就是追过的苹果,然后把手机系的Iphone给它降权,这也是根据用户自身的一些行为,也是千人千面的基础,根据用户的浏览和购买记录,去预测他这次搜索的东西是哪个类目下的。这是大家熟悉的概念,就是说你这个商品属于他个比如说类型的。你是手机通讯还是水果,还是衣服,还是女装、女鞋等等的,这种就是类目。

我们来看一下改写的场景。这里有一个案例,这是O2O场景下,不是一个真实的案例,只是为了说明功能去举的例子。比如说用户传过来的一个词,他是我说要搜的是肯德基的奥尔良鸡翅。我们拿到这个关键词之后,如果人看的话,你很容易知道他想要什么,我们程序怎么执行呢?首先我们会看查询的处理,把你查询词提取处理,因为可以带很多的查询条件。然后做语法解析,拿到用户的查询词,就是KFC的奥尔良鸡翅。然后接下来做一些Normalize,接下来是分词,这跟类型有关系。接着做停用词,停用之后“的”是无意义的词,最终的结果就是KFC的奥尔良鸡翅。接下来我们做一个词权重。我搜的是KFC家的鸡翅,奥尔良是一个搜索词,在没有奥尔良的基础下,我出的是一个香辣鸡翅,我认为也是可以的。然后接着我们去做一个纠错,就是说明显这个奥尔良是写错了,我们会纠成正确的。因为你的商品数据里是正确的,不是错误的。所以如果你按这个错误去找是找不到结果的。所以这时候会做一个拼写纠错的功能。接着会做一个同义词。也就是说同义词里面的,那就是很明显,KFC跟肯德基是同义的,这时候查询就是我要找鸡翅,是KFC或者是肯德基的鸡翅,然后做上奥尔良的一个修饰。然后最终,变成了我的查询语句是改写成这个样子。这是到底层引擎做实际数据搜索的一个词。

接下来第四步,我已经改写好了,就要到搜索引擎查询了。首先会做关键词查询,查询出相关文档之后,根据过滤条件做一些过滤,然后做一些聚合或者是去重,以及统计的一些工作。然后我们看一下这个场景,这就是刚才的查询词,一个查询的结果对应的。我的羽绒服或者是波司登都是倒排去查的,因为倒排链表已经建好了,包含了哪些文档,相当于两个倒排链表取一个交集。这样能拿到符合的商品。接着走正排。每一个商品里面我会看价格是不是在500—1000的范围内,这样把查到的商品又做一遍过滤。然后如果有配这个去重的话,就相当于我会根据商家再做一次打散。这个统计实际上是不干预搜索结果的,是在搜索结果基础之上的,可以展示或分析。这样我能拿到最终符合用户查询的商品集合。这个商品集合怎么展示?会根据你的排序的一个指定的一个策略,去给它做排序。

接下来就是我们刚刚提的,就是最终要展示给用户的展示集合,这就涉及到相关的计算。我们目前提供了两阶段。第一轮粗排跟精排。粗排是一个海选,数据量大,可能上亿,符合羽绒服的查询词非常多,我会针对每一个文档做一个海选。策略是可以自己选择的。再根据一个搜索词的召回文档,我会去先抽取若干条,比如说100万的文档或者是1000万的文档,会按你的促排做一个算分。这是非常影响效率的,所以这个粗排要简单有效。然后我做一个TOPN的精排。这个N一般是千或者是万的级别去做精排的算分。这个算分效率会比较高,你可以参与的用户会更多,按精排的算分再排序,按用户需要的结果返回。

在电商场景下,我们要怎么去考虑相关性的排序的策略或者是因子呢?大家也可以想一下。刚才我们提到了。首先我们假设大家是两轮,当然你可以是更多轮,轮数越多对你查询的性能越慢。对粗排来讲,电商场景下会考虑文本相关性。这是最基础的。比如说搜索羽绒服,得出羽绒服的相关结果。另外一个就是商品质量。因为我们刚才看到了,并不是所有的数据都需要去参与排序。所以我要取最好的。最好的肯定就是商品的质量,那怎么定义商品质量呢?这个可以去考虑。比如说你的销量或者是用户的一个评价,好评数或者是你这个卖家本身会有很多的等级,等等的通过综合的纬度去得出一个商品可能的质量。通过这两个纬度能快速筛选出一批好的商品出来。之后,我们会做更详细的一个排序,因为这个是基础,这个才决定最终给用户的一个体验。所以这个可以很复杂,当然相关性也是必须要考虑的因子。再加上我们说的类似目的预测。我还是以搜索苹果这个话题为例,我搜索搜索之后,包含苹果的,你的水果或者是手机,质量好的商品都被找到了。我可以通过类目预测的方式把你感兴趣的水平还是手机往前排。另外商品的本身的购买量或者是好评数,这个只是列了一个因子,你可以参考这样一些值,作为一个排序的因子。然后另外一个就是个性化的标签。个性化标签是这样的,举一个比较好理解的例子。这算是一个优化的项,我们希望能做到千人千面的基础。比如说实际上你在淘宝里边的一个购买,大部分是买家,买家会被打很多的标签,打的是你的年龄,根据你的一些以往的购买记录,你的消费记录,浏览的量会猜测你的性别、年纪、偏好。比如说你平时买的都是韩式的或者是森女系的,会给你打上很多的标签。这样的标签会对你的搜索产生干预,才能做到说每个人出的是真实符合我的条件的商品。商品也会打标签,我的衣服是什么样的风格,适合多大年龄段的人。这个个性化的标签,实际上就是把用户的标签和商品的标签做配对,看看哪些是最符合你的,并且把这一系列的表现的匹配值作为一整个排序因子来参与排序过程。这个就是一个最简单的场景下可以考虑的一个因子。

我们排序完之后,相当于查询过程基本上就OK了,通过这一步确定了有哪些文档,通过这一步确定了文档返回的顺序,最后拿到摘要。比如说有标题,有价格,有一些点击的信息,有卖家的名字,把这个结果反馈回去,你就可以做这种最终的一个页面效果的渲染。这就是整个的一个搜索,在传统电商的场景下的一个搜索过程。

那这个时间的关系,我们就可以先这个样子。我们可以考虑一下,其实在电商场景下,搜索还能做一些什么事情。

可能大家淘宝的场景下,因为淘宝的入口除了总搜索入口承担了大量的流量以后,还有很多,这是我们运营者会关心的。我会开各种各样的板块。比如说“爱逛街”“海购”等等的。它会有相关的分类,这些是通过搜索选景,比如说我想做一个女装的活动,我怎么确定哪些商品要去参与女装的选品呢。可以在搜索里面通过各种各样的定义的查询条件,包括品牌或者是价格、风格等等的,选出自己想要的数据。再就是不可避免的你的购物车或者是定单等后台分析的数据都是通过搜索来做的。所以搜索可以做很多的事情。包括大家最常见的搜索引擎,包括后续的列表都是通过搜索来做的。



最后编辑:
作者:vicken
这个作者貌似有点懒,什么都没有留下。

留下一个回复

你的email不会被公开。