豌豆荚工程师谈其新版应用搜索技术
豌豆荚近日发布了应用搜索的新版本,主要针对安全、隐私等问题做出了改善,InfoQ就相关技术问题对其工程师进行了采访。
InfoQ:首先请二位做下自我介绍?
陈兴润:我叫陈兴润,是豌豆荚的后台工程师,和吉昌一样也是早期的团队成员,主要负责应用搜索。
丁吉昌:我叫丁吉昌,我跟兴润是同期来豌豆荚的,现在我们也在一个团队,我现在算是应用搜索的负责人。
InfoQ:豌豆荚应用搜索迄今在架构上经历了几个阶段?
陈兴润:主要是三个阶段,第一个阶段,我们当时是为了追求全,就收录尽可能多的应用。在这个阶段我们会有爬虫不断的去爬取各大市场的应用。当时机器比较少,人也比较少,所以更新频率不是很快,大概是一天更新一次,就是从爬虫到最后展现给用户需要一天的时间;第二个阶段,因为对实时性要求不断提高,我们对架构进行了一些调整,大概从爬虫爬到以后,到最后展现给用户需要六个小时;第三个阶段是从今年6月份开始做的,现在从爬虫爬到到最后展现给用户,能够在秒级完成,大概五秒以内就能够在首页出现,用户在30秒内就能够搜到。
InfoQ:搜索的实时性是怎么来做提高的?
陈兴润:第一个阶段实时性不高是因为我们做了页面的静态化,所有用户看到的内容是一样的;第二个阶段,我们去掉了页面静态化的逻辑,加入了一些后端数据库的缓存,这样子在性能没有太多损失的情况下,提高了实时性;第三阶段我们用了一系列的消息中间件,还有使用订阅和发布机制来保证整套系统能够在秒级的时间内更新。 并且最早的时候我们主要是靠爬虫去各个应用商店抓取内容,最近有很多应用商店愿意和我们合作,他们会把数据主动的推给我们,这样能够更快、更实时的拿到最新的数据。
InfoQ:豌豆荚应用搜索这次发布的“绿色标签”和“优质开发者认证”主要是在安全方面做出了改善,这些背后是怎样一个机制?
陈兴润:我们主要有四个标签:
第一个是安全标签,我们接入了四家安全厂商,每爬到一个应用,就会把这个应用交给这些厂商,请他们帮我们做病毒扫描。如果全部都能扫描通过的话,我们就会打上“安全”标记;如果有一家不通过,其他家通过的话,我们就会标上“可疑”标记;如果全部都不通过就会标上“危险”标记,标记为“危险”的应用不会出现在页面上;
第二个是广告标签,我们会收集一些广告SDK,把他们做成黑名单,对我们拿到的每个应用,利用这个黑名单进行过滤,如果应用用到了这个黑名单中的SDK,我们就认为这个应用里面有广告;同样,如果有那种比较恶劣的弹窗广告应用,我们也是不会让它出现在页面上;
第三个是权限标签,我们整理了一些可能危害用户隐私的权限,比如说打电话、发短信、访问他的联系人数据等,如果一个应用用到了这些权限,我们就认为他有可能会触犯用户的隐私,除非他有很好的理由说用这个权限的确是合理的;
第四个标签是Google Play认证标签,主要是针对有些在Google Play上的国外应用。它的原理是:豌豆荚会去爬Google Play上的应用安装包,拿到以后会分析出这个应用的签名,把它存在数据库里,对我们爬到的每一个应用做签名认证。如果他的签名和它在Google Play上的签名是一样的,我们就会给他打上Google Play认证标签。因为有些应用可能会经过国内很多破解或者汉化等加工,加工以后有可能损害用户的利益,破解者可能加一些广告,或者加一些危害用户隐私的代码。如果我们标上了Google Play验证的标签,就说明用户看到的这个应用包和Google Play上的包是一模一样的,即它的确是由原始开发者来提供的,这样就可以一定程度保证这个包没有被第三方非法篡改过;
丁吉昌:还有一个优质标签,其实刚才兴润基本上把原理都讲了,像安全就是我们为什么引入三家、四家?因为我们发现所收录的应用,每家安全厂商对其判断标准还是挺不一样的,比如29%的应用腾讯觉得没问题,360却觉得有问题;同样有接近30%的应用,360觉得没有问题,腾讯觉得有问题,所以我们也就引入了多家安全厂商来做辅助判断。对于广告,豌豆荚会针对超过一百个广告特征进行扫描,是国内做的比较早的。这四个标签对我们的分析来说都比较重要,因为没有任何一个指标能完全保证应用质量是靠谱的,既使是像Google Play这种审核比较严格的市场,也有3%左右的应用是有安全问题的,所以我们就把更多标签都放上去。除了这些标签之外,我们还做了一个用户不可见的事情:相信“用户投票”的结果。在做应用排序的时候会通过五个标签和一个认证来做一个优先级排序,这是一个智能的筛选策略,也是本次重构的重点。
InfoQ:你们在实现这些绿色标签的时候,技术上会有哪些挑战?
丁吉昌:安全方面,我们觉得实现的难点可能是商务谈判上,即如何把不同的安全厂商接入进来,让他们愿意合作;第二就是广告扫描,如何跟的上广告特征增加的速度,因为广告平台在不停的增加,包括他们的特征也不停的增加,这些是需要持续维护的一件事情。
InfoQ:实际上对于广告和权限就是直接看它是否有声明?
丁吉昌:我们会解开他的代码来解析;同时我们还在使用“用户投票”的结果,就是我们会根据用户自己的选择结果来判断哪个应用最受欢迎、哪个应用的签名最受欢迎。对于我们完全没有办法进行验证的应用,我们会用这个策略来判断,同时这里面涉及到的计算量会比较大,因为我们有几千万用户,所以这里面也有些技术难度。
InfoQ:这个是做实时计算吗?
丁吉昌:对,实时计算。
InfoQ:现在我们怎么来做这一块的?有多大的一个集群?
陈兴润:我们是有一个集群,现在其实是有数十台机器跑在Hadoop上。
丁吉昌:主要是Hadoop,一开始我们计算的时候要两天,后来重构算法以后可以做到几乎实时,包括现在豌豆荚上看到那些安装量也都是实时的,当然现在还没有做到每秒去更新,因为计算量比较大;
InfoQ:当应用被收录之后豌豆荚会做哪些工作?
陈兴润:我们的爬虫是以全为目的,尽可能多的收录应用。但是收录进来的应用不一定能让用户看到。会根据一些原则来进行处理,例如违法等应用不会显示也不能搜索到;
丁吉昌:其实收录以后会进行安全、广告校验,也会对完整性、非法性做基本的校验,只有满足这些条件的,才会入到我们最终的库里面展现给用户。
InfoQ:豌豆荚的推荐算法是怎么来应用的?
彭跃辉:目前我们做了“豌豆猜”。为什么做这个东西呢?是因为我们发现用户在豌豆荚里面下载应用,Top200的应用好像就已经占了下载量的95%以上,这样会有一个问题,即大部分应用其实用户都接触不到。做“豌豆猜”当时的目的就是想把一些优质的应用展现给用户。另一方面是应用不像音乐,用户的搜索行为不是太多,用户主要是靠浏览去下载应用;还有就是我们想对一些用户历史行为进行挖掘,去发现一些用户的兴趣点,然后把他感兴趣的应用推荐给他。
InfoQ:挖掘这个算法能够稍微介绍一下吗?
彭跃辉:其实上周六的时候,我们去参加了推荐系统的大会,在会上也简单介绍过。我们发现一个很有意思的点是我们做这件事情的过程和Hulu做推荐系统的演变过程基本上是一样的。我们在最开始的时候,可能是一种基于item的协同过滤算法。随着我们对应用领域的了解,我们发现其实可以把一些应用的特征加进去,就加入了一些基于内容的推荐。这样的话,第二个版本就是一些基于item的协同过滤加上一个基于内容的推荐。做完这部分之后,我们发现这两种策略还是有一些bad case,主要体现就是它经常给出的是一些相似的应用,但不是一些相关的应用。举例来说,比如你下了一个愤怒的小鸟,他会给你推荐一个愤怒的小鸟2。但是相关的想法是,比如说你下了“知乎”,要可以给你推荐“点点”,或者给你推荐“豆瓣读书”这样的应用。我们为了让应用相关性更强就引进了一些topic model的算法。目前我们会对一些应用抽取topic,建立这些应用和topic之间的关联。我们目前就是做到第三步这个阶段;
InfoQ:豌豆荚应用搜索下一步有什么打算?
丁吉昌:就如兴润刚才所讲,我们之前目标是做全,现在的目标是要做精。再长远一点,我们会考虑做一些事情:第一个提供给用户的安装包,首先是安全的,没有广告、弹窗,或者隐私这种问题。但同时还要考虑用户手机是不是能够安装上,因为Android分裂的特别严重,所以也不是每个开发者都有精力来做到所有的手机适配,我们会将适配加入到应用搜索中;另外是运营方面也有一些策略,比如现在正在做的优质开发者,对于优质开发者的应用将会在各种排序和策略上优先展示;
陈兴润:有些事情其实我们还没有特别确定,比如说我们现在做的事情可能是过去三、五个月摸索的时候,发现用户有很多抱怨或者有需求没有满足的时候才开始做的。最终做成什么样,还要根据用户的反馈;