高品质的音视频能力是怎样的? | Qcon 全球软件开发大会·上海站邀请函 了解详情
写点什么

豌豆荚工程师谈其新版应用搜索技术

  • 2012-12-06
  • 本文字数:3475 字

    阅读完需:约 11 分钟

豌豆荚近日发布了应用搜索的新版本,主要针对安全、隐私等问题做出了改善,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 觉得没有问题,腾讯觉得有问题,所以我们也就引入了多家安全厂商来做辅助判断。对于广告,豌豆荚会针对超过 1000 个广告特征进行扫描,是国内做的比较早的。这四个标签对我们的分析来说都比较重要,因为没有任何一个指标能完全保证应用质量是靠谱的,既使是像 Google Play 这种审核比较严格的市场,也有 3% 左右的应用是有安全问题的,所以我们就把更多标签都放上去。除了这些标签之外,我们还做了一个用户不可见的事情:相信“用户投票”的结果,用户好评低于 30% 的应用也不会出现在首页。在做应用排序的时候会通过 4 个绿色标签和优质开发者认证来做一个优先级排序,这是一个智能的筛选策略,也是本次重构的重点。

InfoQ:你们在实现这些绿色标签的时候,技术上会有哪些挑战?

丁吉昌:安全方面,我们觉得实现的难点可能是商务谈判上,即如何把不同的安全厂商接入进来,让他们愿意合作;第二就是广告扫描,如何跟的上广告特征增加的速度,因为广告平台在不停的增加,包括他们的特征也不停的增加,这些是需要持续维护的一件事情。

InfoQ:实际上对于广告和权限就是直接看它是否有声明?

丁吉昌:我们会解开他的代码来解析;同时我们还在使用“用户投票”的结果,就是我们会根据用户自己的选择结果来判断哪个应用最受欢迎、哪个应用的签名最受欢迎。对于我们完全没有办法进行验证的应用,我们会用这个策略来判断,同时这里面涉及到的计算量会比较大,因为我们有几千万用户,所以这里面也有些技术难度。

InfoQ:这个是做实时计算吗?

丁吉昌:对,实时计算。

InfoQ:现在我们怎么来做这一块的?有多大的一个集群?

陈兴润:我们是有一个集群,现在其实是有数十台机器跑在 Hadoop 上。

丁吉昌:主要是 Hadoop,一开始我们计算的时候要两天,后来重构算法以后可以做到几乎实时,包括现在豌豆荚上看到那些安装量也都是实时的,当然现在还没有做到每秒去更新,因为计算量比较大;

InfoQ:当应用被收录之后豌豆荚会做哪些工作?

陈兴润:我们的爬虫是以全为目的,尽可能多的收录应用。但是收录进来的应用不一定能让用户看到。会根据一些原则来进行处理,例如违法等应用不会显示也不能搜索到;

丁吉昌:其实收录以后会进行安全、广告校验,也会对完整性、非法性做基本的校验,只有满足这些条件的,才会入到我们最终的库里面展现给用户。

InfoQ:豌豆荚的推荐算法是怎么来应用的?

彭跃辉:目前我们做了“豌豆猜”。为什么做这个东西呢?是因为我们发现用户在豌豆荚里面下载应用,Top200 的应用好像就已经占了下载量的 95% 以上,这样会有一个问题,即大部分应用其实用户都接触不到。做“豌豆猜”当时的目的就是想把一些优质的应用展现给用户。另一方面是应用不像音乐,用户的搜索行为不是太多,用户主要是靠浏览去下载应用;还有就是我们想对一些用户历史行为进行挖掘,去发现一些用户的兴趣点,然后把他感兴趣的应用推荐给他。

InfoQ:挖掘这个算法能够稍微介绍一下吗?

彭跃辉:其实上周六的时候,我们去参加了推荐系统的大会,在会上也简单介绍过。我们发现一个很有意思的点是我们做这件事情的过程和 Hulu 做推荐系统的演变过程基本上是一样的。我们在最开始的时候,可能是一种基于 item 的协同过滤算法。随着我们对应用领域的了解,我们发现其实可以把一些应用的特征加进去,就加入了一些基于内容的推荐。这样的话,第二个版本就是一些基于 item 的协同过滤加上一个基于内容的推荐。做完这部分之后,我们发现这两种策略还是有一些 bad case,主要体现就是它经常给出的是一些相似的应用,但不是一些相关的应用。举例来说,比如你下了一个愤怒的小鸟,他会给你推荐一个愤怒的小鸟 2。但是相关的想法是,比如说你下了“知乎”,要可以给你推荐“点点”,或者给你推荐“豆瓣读书”这样的应用。我们为了让应用相关性更强就引进了一些 topic model 的算法。目前我们会对一些应用抽取 topic,建立这些应用和 topic 之间的关联。我们目前就是做到第三步这个阶段;

InfoQ:豌豆荚应用搜索下一步有什么打算?

丁吉昌:就如兴润刚才所讲,我们之前目标是做全,现在的目标是要做精。再长远一点,我们会考虑做一些事情:第一个提供给用户的安装包,首先是安全的,没有广告、弹窗,或者隐私这种问题。但同时还要考虑用户手机是不是能够安装上,因为 Android 分裂的特别严重,所以也不是每个开发者都有精力来做到所有的手机适配,我们会将适配加入到应用搜索中;另外是运营方面也有一些策略,比如现在正在做的优质开发者,对于优质开发者的应用将会在各种排序和策略上优先展示;

陈兴润:有些事情其实我们还没有特别确定,比如说我们现在做的事情可能是过去三、五个月摸索的时候,发现用户有很多抱怨或者有需求没有满足的时候才开始做的。最终做成什么样,还要根据用户的反馈;

2012-12-06 06:123207
用户头像

发布了 89 篇内容, 共 29.2 次阅读, 收获喜欢 4 次。

关注

评论

发布
暂无评论
发现更多内容

[Pulsar] F# client的ProtobufNativeSchema实现

Zike Yang

Apache Pulsar 12月日更

了解学习 JSX 的工作方式

devpoint

React JSX 12月日更

MySQL 连接数过多的处理方法合集 - ERROR 1040 Too many connections - 卡拉云

蒋川

MySQL MySQL 数据库

《重学Java高并发》手写一个生产者消费者线程模型

中间件兴趣圈

Java高并发 生产者消费者模型

有了六顶思考帽,从此告别无效争吵

Ian哥

项目管理 28天写作 项目管理工具 六顶思考帽

说说节奏感

Justin

方法论 28天写作

聊聊 Kafka: 在 Linux 环境上搭建 Kafka

老周聊架构

签约计划第二季 2月月更

【LeetCode】截断句子Java题解

Albert

算法 LeetCode 12月日更

.NET 6新东西--nuget包验证

喵叔

28天写作 12月日更

LongAdder解析

程序员历小冰

28天写作 并发’ 12月日更

模块一学习总结

海风

「架构实战营」

Prometheus Exporter (十八)Graphite Exporter

耳东@Erdong

Prometheus 28天写作 exporter 12月日更 Graphite

模块1作业

miliving

大厂算法面试之leetcode精讲23.并查集

全栈潇晨

算法 LeetCode

react源码解析17.context

buchila11

React React Hooks

大白话解析 MySQL 中的 MCCC 机制

悟空聊架构

MySQL MVCC 28天写作 悟空聊架构 12月日更

拖延

Nydia

Prometheus Exporter (十九)Collectd Exporter

耳东@Erdong

Prometheus 28天写作 exporter 12月日更 Collectd

Git进阶(十一):Git 常用操作汇总

No Silver Bullet

git 12月日更

保存并提交修改后的容器镜像

liuzhen007

28天写作 12月日更

自我改变的意义

卢卡多多

28天写作 技术改变生活 12月日更

浅谈指标体系建设(二)

圣迪

指标体系 指标

12 张图 | 深入理解 Eureka三层缓存架构

悟空聊架构

缓存 Eureka 28天写作 悟空聊架构 12月日更

架构实训营

ren

Flutter开发:TextField常用属性的使用

三掌柜

28天写作 12月日更

Flutter 动画【Flutter专题16】

坚果

flutter 28天写作 签约计划第二季 12月日更

Spring中的事务Transactional,这样用真的对么?

xcbeyond

事务 28天写作 12月日更

大厂算法面试之leetcode精讲24.其他类型题

全栈潇晨

算法 LeetCode

react源码解析18事件系统

buchila11

React React Hooks

团队基建系列 - 组织知识传承 1

Hillz

团队成长

豌豆荚工程师谈其新版应用搜索技术_Android_水羽哲_InfoQ精选文章