谷歌中国版搜索业务计划被迫终止 转而搜集分析全球华人搜索数据

来源:数据猿 撰写:Yaphet

据外媒《The Intercept》指出,Google内部已正式终止了开发中国版搜索引擎(内部称为“蜻蜓计划”,又名Dragonfly)数据分析团队的运营,转而研究全球华人的搜索数据。

早前,《The Intercept》就曾揭露过Google的这一秘密计划。报道指出,Google CEO桑达尔·皮查伊(Sundar Pichai)及少数高层在过去2年中,一直在秘密进行着,通过Google旗下中国网址导航页265.com进行数据分析,打造中国版Google搜索引擎的产品计划。

当用户在265.com网址导航页输入关键词搜索时,结果会跳转至百度的搜寻结果页面。Google的这一服务,可通过数据分析团队获取中国网民的搜索习惯,并比较同样的关键词,Google与百度的搜寻结果差异。

Google认为,只要去除同样关键词下,百度等中国搜索引擎没有的页面,Google中国版搜索引擎就能提供符合中国监管要求的搜索服务。

在“蜻蜓计划”中工作的工程师,可获得访问与265.com相关联的API与所需密钥,从而获取大量中国网民的搜索数据集。

但是,265.com网页数据只是该计划的数据组成部分之一,之后,团队将会把重心转向研究全球华人的搜索数据。

近日,有消息人士透露,“蜻蜓计划”团队正在研究来自美国、马来西亚等国家的中文搜索请求。

但是,谷歌内部的数据隐私团队,对此似乎毫不知情。在Google内部,分析用户的搜寻关键词有严格的规范遵循,而且需交由公司隐私团队负责管理。

据报道,Google隐私团队也是在媒体报导出来之后才得知此事,并第一时间与掌管“蜻蜓计划”的高层面谈后,做出了不允许再使用265.com的数据来开发产品的决定。自此,中国版搜索引擎的开发进度就处于停摆状态。

此外,Google内部员工也团结一致,公开向高层抗议,直接向外界发表声明书,要求Google撤除此计划,迫使Google管理层不得不终止这一产品计划。

不过,上周Google CEO 皮查伊在美国国会接受数据隐私质询时表示:“现在。没有计划推出搜索引擎,但未来拒绝将其排除在外”。

Airbnb详细介绍了人工智能搜索的历程

在线预订平台Airbnb拥有超过500万的房源,以及成千上万的旅游,徒步旅行和其他旅行体验。对于任何人来说,这都是一个很大的筛选,但旧金山的创业公司认为人工智能(AI)可以伸出援助之手。

在预印本服务器Arxiv.org上发表的一篇论文(“ 将深度学习应用于Airbnb搜索 ”),该公司的研究人员描述了在两年的时间里,他们实现了一个复杂的神经网络 – 数学函数的层次结构,模仿了人脑中神经元的功能 – 在Airbnb的网络和移动应用程序中,以提高搜索结果的相关性。

该报告紧随Airbnb的内部人工智能系统,将设计草图转化为产品源代码,以及机器学习驱动的语言系统,将列表评论翻译成客人的母语。

“搜索排名应用程序是Airbnb最大的机器学习成功案例之一。大多数初始收益都是由梯度提升的决策树模型推动的,“他们写道。“然而,随着时间的推移,收益趋于稳定。本文讨论了应用神经网络以试图打破这一局面所做的工作。“

正如研究人员所解释的那样,大多数客人首先在Airbnb的网站上搜索特定地理区域的房屋。这些搜索返回从Airbnb的数百万中抽样的有序列表。

最初,“手工制作”的评分功能确定哪些房屋和房间通往顶部。最终,一个梯度提升决策树(GBDT) – 一个识别和排列预测因素的模型 – 取代了评分功能,研究人员称这一转变导致“Airbnb历史上家庭预订的最大改进之一”。

但随着在线预订的收益趋于平稳,该团队将注意力转向人工智能。

Airbnb不仅仅依赖一个AI系统。它采用了一种算法的“生态系统”,可以预测主人接受客人预订请求的可能性,以及客人对旅行或高度体验的评价。他们接受了用户交互培训 – 记录了搜索,每个模型都可以访问它们。一旦经过培训,新模型将进行测试,以确定他们是否在预订方面实现了统计上显着的增长。

Airbnb的第一个人工智能搜索系统为更复杂的搜索系统奠定了基础。第二个采用LambdaRank,一种应用有监督机器学习来解决排名问题的算法,而最终模型 – 深度神经网络(DNN) – 考虑了大约195个特征,包括价格,设施和历史预订计数; 启用Airbnb智能定价功能的商家信息的价格; 以及列表与最近查看的客人的相似度。

当然,这并非一帆风顺。

模范训练是一种反复试验的事情。团队处理管道的第一次迭代,以逗号分隔值(CSV)格式向TensorFlow模型提供数据,仅使用了一小部分图形卡处理能力 – 大约25%。(优化带来了17倍的加速,并将利用率提高到90%左右。)

Airbnb团队测试的其中一个神经网络使用与列表相对应的唯一ID作为特征。我们的想法是将ID编入嵌入(映射到实数矢量的特征),这将嵌入每个列表的独特属性,就像Netflix和亚马逊采用的推荐系统一样。但正如研究人员解释的那样,事实证明这是不可行的; 嵌入需要每个项目大量的数据,并且列表受到来自物理世界的“约束”。

他们写道:“即使是最受欢迎的上市,也可以在一年中最多预订365次,而且每个上市的典型预订量要少得多。”

让事情变得更具挑战性,并非所有趋势都是显而易见的 – 至少,一开始并非如此。列表的长视图似乎与测试中的预订相关,但是当同时预测预订概率和长视图时间的模型在线部署时,它不会导致上升。该团队推测,长期观点可能受到各种因素的驱动,例如高端但价格高的列表,具有难以解析的长描述的列表,或者极其独特且“有时幽默”的列表,以及其他原因。

在特色工程方面,该团队的调查产生了一个先前未考虑的影响入住率的因素:列表具有不同的最低停留要求,有时延长到几个月。他们导致了地理偏好的发现,比如旧金山西海湾南部的位置比跨越桥梁的位置更受欢迎,这些位置往往是交通咆哮。

尽管遇到了所有障碍和挫折,最终还是值得吗?团队似乎这么认为。

研究人员写道:“在无处不在的深度学习成功故事中,我们开始处于乐观的高峰期,认为深度学习将成为GBDT模型的替代品,并为我们带来惊人的收益。” “很多初步的讨论都围绕着保持其他一切不变,并用神经网络取代现有的模型来看看我们可以获得什么样的收益……随着时间的推移,我们意识到转向深度学习并不是替代模型; 而是关于扩展系统。因此,它需要重新思考模型周围的整个系统。“

文章来源:xixi.ai

微信指数上线 快来看起重机械类目词的搜索指数

微信指数上线了,以微信用户的行为数据为基础的数据展示,在这里,你可以研究微信应用用户对机械搜索趋势、洞察网民兴趣和需求、监测起重行业舆情动向、定位受众特征。锐贝电商带你了解起重机械行业产品搜索指数:

上图为手动葫芦搜索数据

上图为起重葫芦搜索数据

上图为手扳葫芦搜索数据

上图为手拉葫芦搜索数据

上图为电动葫芦搜索数据

上图为起重机械搜索数据与趋势

通过指数搜索数据可以更加细化完整的分析行业数据为我们所用,除了百度指数、搜狗指数、好搜指数等之后,微信平台是又一较大的用户活跃平台,希望每一个运营汪可以通过此项进行分析整理,提升产品销售业绩。

每秒1500万并发计算背后高性能 高可用实时搜索系统的架构演变

去哪儿网的定位是做全球最大的中文在线旅行网站。用户第一是我们的口号,也是我们的压力所在。

本文从五个方面讲解去哪儿网高性能高可用机票实时搜索系统的演进之路:

  • 系统诉求。

  • 面临问题。

  • 设计思路。

  • 搜索框架。

  • 报价引擎。

系统诉求

去哪儿网的定位是做全球最大的中文在线旅行网站,对于机票业务来说,就是要把以下这些方面都做到最好:

  • 我们希望用户在我们网站搜索出来的价格是全网最低的。

  • 希望世界有的任何航线,都能在我们网站上搜出报价来。

  • 希望报价的更新是最实时的,用户根本感知不到价格变化。

  • 希望产品最大限度满足用户出行需求。

  • 希望用户预订流畅,心情最愉快。

归根结底我们要取悦用户,用户第一是我们的口号,也是我们的压力所在。

面临问题

但是,如上图这些方面要实现起来,做到最好,都不容易。

机票行业与普通电商不同,它最大的特点是价格和库存变化非常频繁,实时性要求很高,例如:

  • 库存变化体现在航班舱位的状态在时刻变动,特别是热门航线的航班,在出行高峰期尤其频繁。

  • 价格变化则是因为机票的销售体系的特点,除了航空公司本身外,有大量的供应商,不同供应商的机票售价可能不一样,会根据各种情况动态调整,热门航线,出行高峰是价格变化的高峰。

  • 除了供应商,作为机票的主要载体,航空公司也有很多运价方面的政策,这些政策也会根据各种情况进行调整,导致大量航班价格发生变化。

  • 机票行业信息化比较早,所有的航班数据、运价数据、订座出票,都掌握在叫 GDS 的角色手中。

    国内主要的 GDS 是中航信。供应商和我们的数据都要从GDS 手中付费获取,付费一般是按指令执行次数来定的,价格不菲。

    因此我们不可能无限的获取航班数据,这就需要在新鲜度和费用上面做权衡。这也是导致报价变化不实时的一个因素。

  • 不同供应商在 GDS 的权限不一样,同样的航班拿到的报价可能不一样,这就对系统提出了更高的要求。

变化不是问题,问题在于变化的是海量的数据,例如:

  • 供应商在平台上录入大量的规则,来进行定价,这种规则相当复杂,数量级达到 2 亿;航司的运价规则也有上亿的量级,复杂度也很高。

  • 全世界大概有 28 万条航线,我们粗略估算一下,全部的报价量大概会是千亿的量级。

  • 搜索系统要面对每秒 3 千多次的搜索量,单看这个搜索量可能不算大,但是背后有大量的并发计算,每秒要计算 1500 万量级的报价产品。

设计思路

面对这些背景和问题,我们怎么做,能实现系统诉求呢?

有一次有朋友问我,你们怎么这么忙,机票搜索为啥搞这么复杂?放个静态页面上去不就好了,多少用户搜索预订都没问题。我有那么一瞬间,竟无言以对。

不过后来我想了想,要说这样搞也不是不可以,如果资源足够的话,我们大可以做一个很大很大的哈希表,把未来几个月的每条航线每天的航班报价计算好,用户来搜索直接就拿哈希表的数据展示就可以了。

一旦监测到哪个渠道有价格变化,即时计算替换老的数据。这样一来我们的搜索将飞快,并且变价的情况会很少发生,这是最理想的。

然而现实是骨感的,有限的资源不允许我们这样做,所以我们只能从用户的角度入手。

我们参考 CAP 和 BASE 理论,设计了分布式的系统。按需计算,用户需要搜索的数据,采用实时计算的方式,计算完了将结果缓存起来,下一个用户再搜索同样的条件就不用再实时计算了。

系统之间采用消息驱动的方式,使用异步机制来降低耦合,使系统扩展起来很简单。整个系统水平分了多层,各层有各层的缓存。各系统的计算流程都设计为无状态的,可以很容易横向扩展。

搜索框架

如上图就是我们搜索系统大的一个框架,我们将系统分为 4 层,从上到下为:

  • 应用层。

  • 聚合层。

  • 报价源层。

  • 基础数据层。

纵向则根据各层的特点,划分为多个渠道或者多个源。这样划分的好处是不同的层可以独立发展,可以有各自的流量控制和服务降级策略,保证系统整体的高可用;不同的渠道和源可以有不同的处理方式,耦合度低,扩展方便。

应用层接受用户搜索条件,向聚合层要匹配条件的全量报价,经过筛选、包装和排序,输出给前端。按照不同渠道的特点,报价的包装和排序处理会有区别。

聚合层管理着所有航线的报价缓存,以供应商作为独立的存储单元。它接到一个搜索条件,会先问一下 Cachemanager ,有多少个供应商的缓存报价失效了,得到一个需要重新搜索的供应商列表,然后带着搜索条件:出发到达日期和供应商列表,向下层的报价源发消息,然后异步等报价源回消息。

报价源接到消息之后,会对相应的供应商进行搜索,搜出报价之后放到 Redis 里,然后发消息通知 PriceMerger 。

PriceMerger 从 Redis 里将报价取出来,和没有失效的供应商的报价进行聚合,筛选出最优的价格进行包装。

CacheManager 是缓存失效管理系统。我们设计了主动和被动两套缓存更新机制。主动更新就是由各环节发现价格有变化,主动通知 CacheManager 。

比如航班数据、运价数据发生变化、供应商规则数据发生变化、预订发生变价等等,都主动通知 CacheManager 。

被动更新则是根据热度排行,对不同热度的航线,配置不同的过期时间,越热门航线的过期时间越短。

整个系统以供应商作为独立报价单元,报价源遵循这个规则。所以不同的报价源可以很容易接入搜索框架。

各层间的数据交换大多是异步的,用 Protobuf 序列化并 Gzip 压缩,通过 Redis 中转,能很好降低我们的 IO 和带宽使用,也使系统的耦合大大降低,扩展起来非常方便。

纵观整个系统的发展,我们遇到了不少问题,这里总结了一些有代表性的。

一个是报价数量很多,聚合层的系统,内存遇到了不少问题。

有一次新上一种产品,直接导致了系统的崩溃。原因是新产品引进大量的字符串 Map ,这些 Map 还支持随意扩展,一下子涌进来很多对象, GC 都回收不过来了。

这之后我们严格控制了数据的准入,只留必要的数据,尽量采用原生的数据类型,将很多小对象,编码成原生的数据类型,大大缩减内存占用。

另一个问题是报价源比较多,不稳定,有些供应商接口性能不好,回数很慢,而我们对响应时间要求很苛刻。

对此我们采用分批回数的方式,先回来的报价,先返回给前端,多次轮询,直到报价回完,同时我们也设计了一个回数比例模型,如果达到这个比例或者超时,这次搜索就结束了,后台异步等报价源的回数,等下次的用户搜索,就可能看到新的报价了。

对于搜索条件,有个明显的冷热门问题,热门的航线和日期,搜索的人很多,数据量也很大。

我们以航线+日期作为 Key 做了一致性哈希,将搜索条件均衡打到不同的服务器上,并且让相同的条件只会分配到同一台机器上,这样能最大限度地利用本地缓存。

报价引擎

下面我们来深入探讨一下报价引擎的设计和优化历程。

报价引擎作为一个报价源,是去哪儿网的供应商平台、我们内部叫 TTS 的搜索系统,是最核心的一个报价源。

一开始的时候,是没有这个平台的,机票的报价都是从大量供应商的网站抓取的,预订交易都要跳转到外网进行。

流量大了之后为了保障服务质量,有了这个 SaaS 平台,供应商通过这个平台录入他们的定价和服务规则,我们负责把价格计算好报出去,后续的预订交易流程,都在平台上完成。

由分散到集中,这是机票服务发展到一定阶段的必然之路。到后来几乎 80% 的报价都是这个系统产生的。我们花了大量的精力对这个系统进行设计和优化。

一个机票报价是怎么产生的呢?决定因素有供应商规则,航司运价以及航班舱位状态,这些要素组合起来,即可计算出每个供应商每航班每个舱位的价格。

我们会在这些价格当中,选取一些最优的价格,包装成套餐,比如低价特惠、商旅优选等产品,展示给用户预订。

报价引擎解决的核心问题就是,根据用户的搜索条件,对每一个供应商的定价规则库进行搜索,获取符合条件的规则,与航班舱位状态、航司运价进行匹配,计算出每个供应商每个舱位的最优价格。

供应商规则相当复杂,有日期限制、航司限制、航班限制、舱位限制、年龄限制等等,每条规则都有很多使用条件,几十个字段,这些规则量达 2 亿。

可以说供应商定价规则是决定机票价格的最重要因素之一。成千上万的供应商在 TTS 平台上投放规则,少则几万,多则几千万。

这些规则的存储按供应商进行分库,每个供应商一个库,多个库作为一组,分布在一个 MySQL 的实例上,有多个 MySQL 实例。

在这个背景之下,系统面临这些问题:

  • 供应商更新规则数据很频繁,每时每刻都在更新,特别是热门航线。

  • 最坏的情况下,每次用户的搜索都可能会触发所有供应商的规则搜索。 DB承受的压力是用户搜索量乘以供应商数量。这种情况下,业务增长一点, DB 的压力就大幅增加。

  • 在老的系统里, DB 是压力最大的一环,读写都很频繁。曾经单独为搜索做了 7、8 组从库,但是还是扛不住业务的快速增长,故障频发。一家供应商出问题,比如更新太频繁,就可能拖累整个系统交易。

  • 频繁变化的航班舱位,热点航线的供应商规则量大、搜索量大,让系统的内存压力、计算压力很大,应用服务器也经常出问题。

新的报价引擎就是为了克服这些问题来设计的。我们回到搜索引擎的核心技术来看问题。

搜索引擎主要是对收集到的信息进行整理、分类、索引以产生索引库。我们是不是应该组织一个合适的索引库,让搜索的效率大幅提升呢?

对用户搜索条件进行了分析,我们发现用户搜索的是航线日期,并不关心哪个供应商。但是我们因为系统结构的原因,要对所有的供应商库进行查询。

聪明的做法是做一个适合航线搜索的索引库。我们将所有的航线拿过来,进行了热度排序,均衡打散为 N 个表, N 个表平均分布到 M 个库。

然后开发了一个数据同步系统,将供应商维度的规则,实时同步到航线维度分表的索引库。

这个数据同步系统以 Binlog 同步方式工作。我们引入了阿里巴巴开源的项目 Canal ,这个项目通过实现 MySQL 的主从同步协议,能把自己伪装成从库,实时增量获取 MySQL 的 Binlog 数据。

我们通过 Canal 拿到增量的 Binlog 数据之后,做解析、拆分,将供应商规则按航线分布插入索引库,或者从索引库删除。

这时我们面临的问题是:

  • 源数据写入量很大,集群峰值达 20K TPS。

  • 为了保证报价的新鲜度,我们要求同步延迟很低,不超过 60s。

  • 必须保持顺序一致性,如果先删后插变成先插后删,数据就不一致了。

  • 必须保持数据最终一致。

  • 系统必须是高可用的。

针对前面 4 个问题我们的解决方案是这样的:

保证读 Binlog 的吞吐量

源数据写入量、顺序性与同步延迟是矛盾的,为了保持顺序,一个 MySQL 实例只能由单线程来读 Binlog 。

但是如果 MySQL 实例上的供应商数量很多,短时间数据更新量就可能很大,单线程处理不过来,同步延迟势必很大。

因此我们将规则库分散到更多的 MySQL 实例上面,从物理层面保障了更多通道并行同步,提高读 Binlog 的吞吐量。

保证写索引库的吞吐量

Binlog 数据解析、分拆处理到写入索引库阶段,为了保持顺序写,似乎也只能每个 MySQL 实例单线程来做,可是这样写的吞吐量上不去,同步延迟也会很大。

仔细分析一下,其实并不需要全局顺序一致,只需要每条航线的数据顺序保持一致就可以了。

我们按航线划分了很多的队列,不同航线的 SQL 在各自队列里保持顺序入库,这样并行度就高了,写入的吞吐量也就上去了。

保证数据的一致性

增量同步可能会因为一些网络问题或者入库失败,导致数据不一致。

这个时候,为了让数据最终一致,我们又设计了一个全量数据 Diff 的功能,定期(比如 5 分钟一次)对两个库的数据进行比对,如果有不一致的,通过增删来保持索引库的数据跟规则库保持一致。

这就保证数据在异常情况下能短时间达到最终一致。

系统的高可用

我们希望任何一个环节出现问题都不影响数据同步。这里可分为两部分, Canal 这边本身已经提供了方案,应用服务器和 DB 都配备主备自动切换来保证高可用。

我们的同步程序,也设计了一套方案。系统是分布式的,一共有 K 个 MySQL 的实例,分配到 P 台服务器上。

这是一个任务分配问题,可以达到几个效果:

  • 任务分配要均衡。

  • 分配完之后保持稳定。

  • 某台服务器挂掉了它上面的任务需要自动切换到健康的服务器上,不影响其他的任务。

  • 加入了新的服务器,任务重新分配,保持各服务器的负载均衡。

我们利用 ZK 作为协调者,从集群服务器中选出一台 Leader 来执行任务分配,依靠 ZK 的节点发现和通知机制,实现了这四个功能。

这样我们的整个同步系统是高可用的,在吞吐量很大的情况下,峰值延迟不超过 60 秒,平均延迟 10 秒左右。

索引库构建好了之后,我们的系统结构可以是这样的。

入口接收 PriceMerger 的搜索消息,这个消息会带着《出发》、《到达》、《日期》还有《供应商列表》这些参数,随机打到分布式集群的某一台搜索服务器上。

服务器把符合这些条件的供应商规则从索引库查询出来,同时并行把航班数据、运价数据取回来,进行匹配、计算、筛选,计算出每个供应商的舱位最优价,将结果写入 Redis ,最后发消息通知 PriceMerger 。

这个流程很清晰,只需要查一次库,理论上 DB 是没有什么问题的,应用系统也很容易扩展。

系统做出来之后,还是遇到了两大问题:

  • 索引库压力很大。

  • 部分服务器的负载很高,GC 频繁,吞吐量上不去。

为什么会这样呢?这个时候我们是比较沮丧的,但是问题还是要解决。我们考察了搜索条件的特点。

首先,搜索的请求条件冷热门很明显,热门航线比如北京到上海的请求很多,投放这些航线的供应商也很多,规则数量很大,热门航线的航班数量和运价数量也很多。

这些因素结合起来,一次热门航线搜索, DB 和应用服务器的 IO 占用都很高, CPU 方面光反序列化就占用不少,报价计算的量很大,这就导致了 DB 和应用服务器的负载都很高,但是吞吐量上不去的情况。

另外我们的供应商规则,以及航班数据和运价数据,有大量的 String、Map 和 List 等对象,尤其热门航线的搜索,请求量稍微大一点,堆内存占用很多,释放不掉, GC 根本回收不过来。

分析了这些情况之后,我们有两个措施,一是想办法大幅减少 DB 的请求量,二是想办法减少内存的占用。

如何能减少 DB 的请求呢?有效的办法是在应用服务器增加本地的 Cache 。

查询出来的规则数据,不扔掉,放在 Cache 里下次同样条件的请求直接使用。

然后每次搜索进来的时候,去索引库检查一下这个条件下的规则数量和最后更新时间,有变化的话就将缓存清掉,从 DB 取一遍,保证缓存数据的新鲜度。这样一来, DB 压力陡降,服务器 IO 也降了很多。

有了本地缓存,我们需要让缓存命中率尽量高,并且保持稳定。根本的办法是让同样的请求条件,每次都打到同样的服务器上。

直接将请求按航线进行一致性哈希,可以达到效果,但是这样会有冷热门航线的问题,会导致部分服务器的负载不均衡。

我们对负载均衡策略进行了扩展,将航线+单个供应商作为哈希条件,一致性哈希分到某台服务器,之前的供应商列表就会分多批,一个请求分裂成多个请求,进行分发。

由于是一致性哈希,命中率会很高,并且我们增减服务器,不会引起缓存命中率的大面积变化。

单台服务器上的规则缓存,只是某些航线的部分供应商的规则,并不是全量规则,在集群服务器数量足够的情况下,不会占用单台服务器太多的内存。

DB 的压力在做了 Cache 之后大幅降低。但搜索量上涨后还是会出现负载高的情况。原因是每次搜索都会要检查规则是否更新,这个 SQL 执行量很大。

有没有办法减少它呢?回顾整个系统,其实我们已经在数据同步的时候就知道了供应商是否更新了规则,可以在这个时候,去通知引擎,将该条件的本地缓存失效掉。

这样就不需要每次搜索都去 DB 里检查了,作为兜底可以 1 分钟检查一次。这样 DB 就毫无压力了。

另一个措施,是缩减内存的占用。

每条供应商的规则都有几十个字段,这些字段有很多 String ,整形,日期等对象类型。航班数据、运价数据,包含大量的 Map 数据。作为本地缓存,这些数据对象会长时间存在,如果占用内存太多, GC 都回收不过来。

分析一下特征,我们发现很多对象,都是一些个数有限的字符串,比如机场码,航司代码,航班号,舱位代码;还有一些日期的对象,只是精确到天;一堆定价的数值、一堆布尔值。

这些对象实际数据不大,但是对象的开销不小,比如一个两字节的航司代码的 String 对象,内存就要 48 字节,还有很多的小对象,由于 Java 的内存对齐,会导致大量的内存间隙,造成内存的浪费。

针对这些特点,我们做了一系列策略:

  • 小的个数有限的字符串,做一个 Byte 类型的编码表,减少创建字符串对象。

  • 针对一堆 Integer ,我们构造了一些 Short 数组,int数组来承载,减少对象开销,避免内存对齐产生的间隙。

  • 针对日期,我们计算一个距离 5 年前的偏移量,存成 Short 数组。

总的来说,尽量减少内存的浪费,最后我们内存使用大幅减少,有接近 50% 的降幅。这样一来内存也不是问题了,吞吐量就可以上去了。

除此之外,我们还在其他方面对系统进行了性能优化:

  • 在计算中采用异步 HTTP 或者异步 Dubbo 方式,并行获取需要的资源。很多计算能并行的都并行来做,杜绝锁的出现,充分榨取多核 CPU 的计算能力。

  • 对于一些复杂计算,结合业务进行剪枝,降低时间复杂度。

  • 适当的用空间换时间,比如一些重复的循环计算,把中间结果缓存起来,后边直接用。

  • 优化 Jvm 参数,缩短对象驻留内存的时间,减少 GC 次数。

  • 数据交换用 Protobuf , Gzip 压缩,减少 IO 。

  • 重启机器时候负载很高,每次发布都会影响服务性能,对此我们发现主要的问题在于 Jit 即时编译,在量上来的时候,启动 C2 线程进行的字节码编译,会耗费大量的 CPU 。

    对此我们做了预热机制,启动时对外服务前,先预跑让 Jit 编译完成,同时会重建大部分本地缓存。

通过这些优化,这个集群的性能达到一个非常好的状态,在 QPS 达到 5w 的情况下,响应时间在 50ms 以内,负载也比较低。

以上就是我们搜索系统的设计和优化历程。

我们回顾一下,对于搜索框架我们进行了水平分层,纵向分渠道,除了良好的扩展性,不同的层可以做不同的降级策略,流量控制,保证系统高可用。

我们采用实时计算+阶梯式缓存,来做到成本与报价新鲜度的权衡。我们设计了闭环系统来保证缓存的更新。

对于报价引擎我们设计了适合航线搜索的索引库,开发了高可用的实时同步系统。

设计了一个分布式本地缓存,大大降低 DB 的压力,分享了我们是如何缩减对象内存的,还有就是如何合理利用一致性哈希做负载均衡。

我们会发现,不同的业务场景,有不同的特征,最好的思路是根据特征去进行设计和优化。由于木桶效应的存在,通用的实现大多数不是最优的,因为兼顾了通用性。高性能系统的设计,真的是需要量体裁衣。

作者:梁启康

编辑:陶家龙、孙淑娟

出处:转载自Qunar技术沙龙微信公众号

梁启康,去哪儿网机票事业部国内研发部技术总监,多年互联网业务一线研发经验,2013 年加入去哪儿网,从事国内机票搜索报价研发,期间对机票搜索进行了重构,围绕着高可用、高性能、可扩展打造了支撑业务快速发展的实时搜索系统。对高可用高并发的分布式系统设计有较好的理解,对高性能的程序设计有丰富的经验。

移动增长红利衰退 技术能否拯救搜索行业

如你所知,在互联网江湖,相较于其他领域入局者相互搏杀的戏剧性,搜索市场无疑有些乏味。就在最近,几份关于这一市场的报告相继出炉,再一次印证了搜索行业持续已久的格局与秩序。

7月27日,艾媒咨询(iiMediaResearch)发布《2016上半年中国移动搜索市场研究报告》,报告显示,截至2016年Q2,中国移动搜索用户规模达到6.20亿,毫无意外,百度仍以明显优势领先其他品牌。几乎同时,CNNIC(中国互联网络信息中心)也发布了《2015年中国网民搜索行为调查报告》,数据同样指向了这家巨头在搜索领域的难撼,在综合搜索引擎品牌渗透率排行中,百度搜索以93.1%的用户渗透率居第一,360搜索/好搜搜索与搜狗搜索(含腾讯搜搜)则以37.0%和35.8%分列第二与第三。

除此之外,Analysys易观《2016年第2季度中国移动搜索市场季度监测》数据同样显示,2016年第2季度中国移动搜索访问次数比例中,百度占78.5%,搜狗占到6.6 %,易搜占到5.3%,分别位居市场前三。

虽然同台者都在试图伺机攫取更多份额,但坦率地讲,上述三份报告委实不足以撩拨更多局外人的神经。毕竟,谈论中国搜索市场行业格局并非一个新鲜的故事,回溯历史,收益递增原则使得百度搜索成立至今十余年来,一直占据七八成左右的市场份额。

倘若你和我一样,认为“搜索”二字的含义将转向“高度服务化”“日趋智能化”以及“入口极简化”,那么透过报告,观察技术迭代更新对搜索行业的影响似乎更具意义。

搜索的新故事

无论对于资本市场还是更大范围的用户,“搜索的故事”都是时候切换到“下一章”了,毕竟当中国市场的人口红利和流量变现都日趋不再诱人,至少从直觉上,如果未来真有什么可以被称为壁垒,那么最大可能即是技术本身,在巨大的不确定性面前,它似乎要比看似完备的商业模式更为关键。

事实上,搜索未来的趋势已经显露,艾媒咨询发布的《2016上半年中国移动搜索市场研究报告》显示,40.8%用户认为搜索结果本地化是提升移动搜索个性化的最好解决方法,另外有35.9%的用户认为人机交互是主要的解决途径。分析师认为,针对用户对于移动搜索工具个性化功能的需求增加,移动搜索厂商应着力提升搜索结果本地化,而接下来的重点将是提升搜索引擎的人机交互功能。

互联网女皇米克尔发布的《2016年互联网趋势报告》中提到,在过去两百年的时间里,人机交互一直处于不停地进化之中,尤其近75年间,更是每隔十年便会有一次大的创新,而现在语音应当是最有效的计算输入形式。在其看来,语音对于用户十分快速,语音输入具有无需动手和即时操作的特性,使得这种人机交互十分简单方便。此外,语音输入的个性化和多轮交互也备受用户喜欢。这与百度副总裁王海峰说过的“语音搜索准备消灭键盘输入”不谋而合。集成语音识别、语义理解、深度问答、知识推理等能力于一身后,相较于键盘输入,百度语音搜索已经能够满足用户的多种复杂需求。

在百度Q2财报中也提到,以人工智能基础平台为核心,用户以语音、图像方式表达需求的搜索请求保持高速增长,百度搜索结果准确性持续提升。而关于百度人工智能技术的布局,据《财经》杂志报道,百度确实已成为全球对人工智能投入最大的公司之一。更重要的是,相较于一些将人工智能关在实验室里的公司,百度在技术落地甚至变现的步伐上效率很快——而具体到搜索,可以肯定的是,越是在未来,人工智能对巩固其搜索行业地位的作用也会越大。

当然,未来由现实铺就,艾媒咨询发布的《2016上半年中国移动搜索市场研究报告》显示,如今89.7%的用户偏好使用文字来进行搜索,而偏好使用语音进行搜索的用户占比为37.2%,位居第二,趋势已显。其实不难发现,年轻用户的搜索行为正在向语音靠近。“未来已经来临,只是尚未流行”这句俗语的一种解释是,只有少部分人能勾勒出未来的模样——他们正是年轻人,他们当下所代表的生活方式即是未来的大多数。从这个角度,百度将人工智能的重心放在此处并取得不俗成绩,无疑是在瞄准搜索的未来。

那么问题是,除了能和机器说话,未来的搜索引擎究竟是什么模样。

搜索的未来

事实上,悉心留意,它已显露出某种雏形。

相信不少人都有这般体会,当你埋头在某个手机应用,然后忽然想搜索某个东西唯有切换应用,移动端不同应用切换产生的摩擦更为令人不适;另一方面,人们似乎也已渐渐褪去了下载新APP的欲望,在不少人看来,各垂直领域的APP也许只是信息和服务聚拢的一个阶段性产物。

非常明显,信息由分散走向聚合贯穿了整个信息简史。PC时代,Google和百度这些搜索引擎成为信息与服务的聚合器,而在刚刚起步的移动时代,不同应用的割裂也许将被新的“聚合器”打破——一个合理猜测是,用户只要提需求就好,然后把一切交给“搜索引擎”。

事实上,这已接近人工智能在现阶段的一个较为靠谱的定义:试图用自动化知识解决一切问题的工具。

说回百度,不同于其他搜索引擎单纯在内容一端进行完善(譬如搜狗拓展了知乎和微信内容)。百度对“搜索”的定义更具野心,它早已将用户搜索需求与消费、服务、出行更为紧密地连接起来,这无疑会大幅提升搜索的市场价值。

关于搜索的“野心”,百度表现的更为明显。去年百度推出的秘书化搜索服务的机器人助理度秘,以连接3600行实现服务接入,进行全网数据挖掘支撑服务索引,最终实现智能交互完成服务满足。度秘的出现可以说是百度对搜索行业进行重新的定义,未来关于搜索更多的是定位在提供智能的“秘书化”服务,让每一个用户都能享受到搜索带来的“私人订制”化的服务,百度的这一举动势必会对整个搜索行业带来新的变化。

搜索引擎的出现是为用户提供优质的服务体验,尽管随着技术的迭代更新搜索的方式从PC端转移到移动端,但搜索仍旧是消费者寻求本地服务的重要入口。度秘这一秘书化的搜索方式在百度整个生态体系中,包括餐饮、高考等生活服务场景中都发挥出优势。在今年7月份,度秘就被应用于高考搜索服务场景,利用“人工智能+大数据”为500多万考生解答并提供高校选择的参考,期间响应高考服务请求超过3000万次。王海峰认为,度秘将肩负着百度一贯的使命,让人们平等便捷的获取信息、找到所求,并享受服务。

新旧技术的更迭让搜索之于信息世界的角色不断演进,不少人工智能学者都已形成共识:人工智能加持下的搜索是未来,而未来应该是简约的,它将变成某种“统一体”,并由此带来陪伴感——我看到过的关于未来搜索引擎的最佳定义就是:它应该是你最好的朋友。

希望如此。

李北辰/文(知名科技自媒体,致力于为您提供文字优雅的原创科技文章;微信公号:李北辰)

微信测试全新功能 应用内搜一搜堪比百度搜索

昨天晚上,微信在神不知鬼不觉的情况下向部分用户推送了新功能测试,应用内的“搜一搜”功能迎来了改头换面级别的大变化。只不过这项更新是后端更新,这也就是用户不需要更新客户端就能获得更新,但同时也意味着,除了被腾讯选中意外,没有其他办法可以体验这项新功能。

这已经是微信“搜一搜”的第三次升级了,在升级后功能也会更加强大。简单说,就是加强了“服务直达”的体验,在搜索栏输入关键字后,对根据语义的不同出现不同优先级的内容。比如输入地名,那么就会优先显示当地的资讯信息;如果搜索的是公众号,那么就会优先显示该公众号名片和小程序,如果搜索歌手就会优先出现音乐作品等。

(图片来自微信公众号晓程序观察)

这个搜索功能的升级,最大的受益者显然是那些有意推广自家产品的商户,未来推广自己的产品又多了一个新途径。同时,这也意味着微信的功能继续往“大而全”进化,可以看作是在软件内集成了一个小型的“百度搜索”,相信未来微信还会有更多的花样出现。

搜索竞价推广账户的恶意点击分类 判定及处理办法大全-上

提及恶意点击,广告主是深恶痛绝,搜索资源媒体方更是讳莫如深。那么在搜索推广的过程中是否存在恶意点击?答案是必然的!

我看百度百科的解释是这样的:

接下来,老阳带你详细了解恶意点击的各类情况的防范及排查处理办法:

首先:对于大多数广告主口中的竞价广告消费多,点击量大,咨询少而判断出来的“搜索推广都是恶意点击”,这个说法是不正确的!判定恶意点击必须要有一个排除的前提:即无效点击!

仅基于推广账户的消费、点击、转化数据的不良,并不能确定恶意点击是否存在,鉴于搜索引擎广告的匹配方式导致的模糊检索可能带来大量的无效流量,而导致ROI产出较低并不属于恶意点击!因此,此类情况必须排除!

如上图所示, 投放关键词“全自动加料机”匹配搜索词“自动切菜机”带来的流量完全无效,但这并不是恶意点击!除此之外还有一些特定的账户设置功能,会放大消费而带来无效流量。因此此类情况不纳入讨论。

我们接下来仅讨论:有目的性的只是为了点击广告,而恶意采用的手动或软件的点击行为。

这些行为都是这么产生的呢?

竞价托管运营老阳认为,恶意点击主要存在以下两类可能: 1、广告主竞争对手的恶意消费

对于竞争对手的恶意消费,比较严重的一般出现在比如医疗类竞争激烈且SEM团队成熟度的情况下,其方式简直五花八门!防不胜防!基于搜索引擎本身近年来对医疗的规范运作,情况已经有所好转。

2、广告主潜在用户的报复消费

对于广告主的潜在用户的报复性消费,一般都是零星存在,只能产生有限的损失,不足为患。

当然,有的朋友还会说,媒体资源方自己也恶意点击,在老阳看来这个是个笑话,不排除有个别服务商有过这样的行为,但一定干不长久!而正规厂商是不会搬石头砸自己的脚的,也没这个必要。

竞价托管运营老阳认为恶点行为一般可能存在以下几种方式:1、软件挂VPN进行模拟点击

此类点击存在一定的技术壁垒,不是专业的人员玩不动,但是杀伤力巨大!搜索引擎厂商对此类行为的防范及其严密,但道高一尺,魔高一丈,市场随时在更新新的方式,一定会给搜索投放的广告主带来阵痛。

2、群发信息或挂机任务指定信息点击

此类点击行为范围有限,但是完全是有效的点击行为,搜索引擎厂商也管不着,一旦广告主被采用这样的方式盯上,极为头疼!

3、个体行为恶意点击

此类点击行为方式意义不大,当前搜索引擎厂商技术已经趋于完善,由此带来的伤害较小。

除此之外,你们是否有其他的恶意点击行为类别呢?欢迎留言交流!

下一期我们更新《搜索竞价推广账户的恶意点击防范、排查及处理办法大全(中)》:介绍恶意点击的表现方式及判定标准,下期再会!

湖北优梯教育 深挖行业蓝海关键词 引爆免费搜索流量

原创/湖北优梯教育学院(转载请联系原作者,禁止二改上传)

应各位掌柜的要求,深挖蓝海关键词的操作终于在今天面世啦!这个知识点主要针对一些没有访客、做不起来的店铺,也是适合新手店铺起步的一个操作,如果大家看完文章有疑问或没懂的地方,可以按文章末尾的方式联系优梯的老师详细咨询。

一、挖掘关键词

找词一定要用到生意参谋里面的市场行情工具,进入行业热搜词页面,选择自己宝贝的所属行业类目,时间选定最近7天。

行业热词榜下总共有五个板块,每个板块下不止有热搜词,还有行业飙升搜索词(短时间内涨幅非常大的搜索词)。

从这些页面选择一个搜索词点开,我们可以看到很多由这个词延伸出来的相关关键词。

选择关键词的第一步就是收集关键词,在做这一步的时候掌柜们一定要有耐心,看到人气较高的搜索词要一个个点进去看。

二、关键词参考维度

当我们挖掘了关键词之后,会有一个关键词参考的维度,为什么会有这个?就是为了让我们从成千上万的词里面选出好词。我们做标题,每一个关键词的数据都是需要清清楚楚的,所以就有了以下三个参考维度的产生。

1.按照在线商品数排序

在线商品数顾名思义就是现在市场中使用这个关键词的有多少件产品,数值越高代表你的竞争度越高,所以这个指标越低越好。

那么,就会有很多卖家就会问了,那么这个指标的数值限定在多少比较好呢?有没有一个具体的数值范围?其实这个是没有绝对参考值的,因为每个人做的商品不一样,它的市场竞争度也是不一样的,我们还要根据下面两个维度来选择相对较好的词。

2.按照人气排序

这里的人气指的是全网用户的搜索人气排序,人气当然是越高越好,但他也不是绝对的,如果有一个关键词它的搜索人气有10000,在线商品数有5000,而另一个关键词搜索人气有5000,在线商品数只有200,那么我们最好是选择第二个关键词。

3.商城点击占比

商城点击占比指的是天猫店与淘宝店铺的竞争度,商城点击占比越高证明天猫店的优势越高,商城点击占比越低证明淘宝店的优势越高。

三、辨别真假关键词

通过上面三个维度的评判我们可以将市场行情中的大量热搜词进行一个初步的筛选,将这些达标词的数据一个个收集到Excel表格中进行整合,为我们进一步的筛选做准备。

到这一步的时候词的数量还是挺多的,但我们的标题只有30个字,所以要进行一个更精细的筛选。

1.辨别品牌词

首先要去掉的就是一些品牌词,如果你的宝贝不属于这个品牌,就绝对不能用别人的品牌词,否则就属于售假。但也有一些品牌词,你根本不知道它是否属于品牌词(不出名或容易与热词混淆),遇到这样的词,直接复制进淘宝搜索,在主图上有商标的词一般都属于品牌词,像这样的词,搜索人气再高也不要使用。

2.辨别真假词

A.关键词相关性

在选择关键词的时候,并不是所有的好词神词都能拿来用,无论多好的词也需要跟你的产品是相匹配的,例如:你做年龄使用范围在8-9岁的女童鞋,但“女童鞋1-2岁”这个词的人气很高,转化率也很高,每天又有成交,可以证明这是一个好词,但是你能不能用呢?很明显不能,因为就算这个词给你带来了再多的点击,你的转化率也上不去,跳失率会极高。

B.关键词的真假

当你找到一个在线商品数少,搜索人气又高的词时,不要急着把它记录到你的表格里,我们还需要点开通过数据来判断它是不是一个真词。有的词一直都有搜索人气,但点开30天的交易指数,却发现这个词的成交量在某几天突然飙升,然后在其余的20多天全是0,那么这个词就是一个假词。真词的交易指数在30天内一般都是每天都有成交,或者是陆陆续续有成交。

四、组合标题

1.匹配原则

在上一步留下来的词中,我们要挑选一个词为中心,挑选最有优势的词,这里以第一个词“全皮小白鞋女2017新款 真皮”为主,然后将剩下的词组合到一起。有空格的词是非常好组合的,但有时候我们会遇到没有空格,紧密结合在一起的词时,我们该如何去组合它们呢?

例如“全皮小白鞋女2017新款 真皮”和“秋季小白鞋女真皮2017新款 韩版 白搭”这两个词,当遇到这样的词,我们可以直接综合评估两个词,谁更有优势? 很明显,第一个词要更有优势,这样我们可以直接将第二个词舍弃,保留第一个词就好。如果一定要组合,我们可以将秋季保留下来,将没有空格的部分组成“秋季全皮小白鞋女2017新款”。

有空格的词先直接组合起来,将重复和不太符合的词删掉,我们可以得到一个初步的标题雏形。

2.组合方案

组合方案分为以词选款和以款选词两类,看字面意思就可以明白。以词选款可以有很大的选词空间,组合的标题也会比较好,但选款的时候不一定能找到完全符合标题的款,而以款选词就是先有了图片,根据图片去选择符合的词,一般相关性较高。

3.注意事项

A.关键词重复

关键词的30个字中最好不要有重复的词,如果实在是找不到属性词或者长尾词凑满30个字,我们可以选择将权重最高的词(例如上例中的“小白鞋女”)重复使用,做一个权重的叠加。

B.关键词冲突

关键词冲突很简单,就是在一个标题里边不要出现相违背的词,例如同时出现“长筒”“短筒”;“平底”“厚底”;“韩版”“英伦”是不可取的,当标题中的关键词相冲突的时候,搜索引擎会很难去判断产品的性质,从而对产品的权重和排名造成一定的影响。

C.位置摆放

关键词的摆放位置也是有讲究的,同样的词摆放顺序不一样,所得到的数据也会不一样,当你不确定一个词的摆放位置的时候,我们可以将不同的摆放方式复制到市场行情中进行查询,看哪种摆放顺序更优,以此来决定关键词的摆放位置。

由于是新店,我们前期做标题最主要的目的,就是为你的店铺带来流量、带来访客,尽量多找搜索人气高的神词才是我们的目标。每天手动上架一两款宝贝,观察店铺新增访客数,如果上架一周没有访客,那么不要留恋,直接删除就好,如果有几款宝贝的标题带来了流量,那么后期我们再来对这个标题进行优化。

百度搜索量 哪些城市更强 一搜就知道

DK 脑洞,我是刘德科。在百度搜索上任何一个关键词,会跳出:百度为您找到相关结果约多少个。这么简单地搜索一下,也可以是观察事情的一个角度:我们把 4 个直辖市和 15 个副省级城市逐一搜索一遍,就可以得出不同的搜索结果数量。百度的搜索上限是 1 亿个结果,比如你输入「中国」这个词,能得到 1 亿个结果。

搜索结果数量上亿的城市有五个:上海、北京、深圳、广州和成都。或许,百度搜索量,在一定程度上能够反映城市的综合实力。◆中国副城级城市百度搜索结果数量

注:北京上海天津重庆为直辖市,苏州、郑州和长沙虽不是副省级城市但列入作为参照。如果我们把房企名称作为百度关键词,会怎样?排名第一的,是万达。当然,百度搜索结果数量只能一定程度上反映房企的知名度,无关美誉度。◆中国房企百度搜索结果数量TOP10

注:绿地、新城、中南等名称具有多重含义干扰性的房企不列入统计如果我们把房企董事长作为百度关键词,会怎样?前三甲是王健林、许家印和孙宏斌。◆中国房企百度搜索结果数量TOP10

注:金地集团董事长凌克受到吉利汽车品牌凌克的同名干扰,故不列入统计。今天我们只是提供一个观察事物的角度:随意百度一下,也可以看出一些事物的高低之分。像百度这样的日常工具很多,我们想要区别的事物也很多。你只要保持一颗好奇心,世界就会显得更美妙。好,这里是 DK 脑洞,希望我可以讲上一千零一夜。下期见

Facebook允许谷歌搜索其移动应用内部分信息

北京时间11月17日早间消息,谷歌母公司Alphabet一名发言人表示,Facebook从上周五开始允许谷歌搜索引擎爬虫编目其移动应用内的信息。

谷歌和Facebook的上述合作协议意味着,在谷歌的移动搜索结果中将出现Facebook应用内的某些内容,包括公开的个人资料信息。这样的搜索结果将会以“深度链接”的形式出现,用户点击后将转向Facebook应用的相应部分。此外,谷歌搜索引擎还将编目Facebook平台上的专页、群组和活动信息。

不过,谷歌搜索引擎不会编目用户登录后分享,或是设置为私密的内容。叶居士说,Facebook上的大部分内容仍将在Facebook上才能看到。

谷歌搜索引擎目前主导桌面搜索市场,但无法自动编目及归类应用内的信息。与此同时,用户在智能手机上所花的时间正越来越多。因此,谷歌需要说服应用开发者,允许其搜索引擎爬虫进入这些应用。

Facebook发言人表示:“当人们在移动互联网上搜索公开的Facebook内容时,安装了Android版Facebook应用的用户在点击后将直接跳转至应用。”