如果你有兴趣的挑战后端团队OkCupid正在研究,188bet金宝搏官网我们正在招聘

作为一个约会应用,体验的组成部分,是在向您推荐根据你和你的潜在匹配已设置偏好的无数巨大潜力的比赛。你可以想象,有很多诱因,因为它是非常第一步大家开始在得到的比赛,对话,超越之前优化的经验,这部分。

您设置首选项,但不是我们如何向你推荐潜在的匹配(或推荐其他潜在的比赛给你)的唯一因素。如果我们只是简单地显示所有符合您指定的标准,没有任何类型的排名的用户,最终的结果会是这样不太匹配。例如,如果我们不试图整合用户的近期活动到的结果,就不会有更高的机会,你花你的时间多与人谁最近没有使用的应用程序进行交互。当然,这并不为用户设置了成功!除了简单的你和其他人设置的首选项,我们利用大量的算法和因素,建议用户,我们认为你应该看到的。

当服务的建议,我们要为在那个时间点上的最佳效果,让你不断看到更多的建议,你喜欢或传递您的潜在匹配。在其他应用程序在内容本身可能不会改变经常或及时性等不太重要,这可以通过离线系统来完成,每隔一段时间,再生这些建议。例如,使用Spotify的“发现周刊”功能时,您可以享受一套推荐曲目而是集被冻结,直至下周。在OkCupid的情况下,我们188bet金宝搏官网允许用户不断地实时查看他们的建议。该“content” that we recommend -- our users -- are highly dynamic in nature (e.g. a user can join, change their preferences, profile details, location, deactivate at any time, etc.) and can change to whom and how they should be recommended, so we want to make sure that the potential matches you see are some of the best recommendations you can see at that point in time.

进军不同的排名算法,同时能够不断满足实时的建议,我们需要利用一个不断跟上最新的用户数据,并提供能力进行筛选和排序潜在候选人的搜索引擎。

还存在哪些问题已有的匹配系统

188bet金宝搏官网OkCupid一直利用定制点播服务匹配系统多年。We won’t go into full detail on that matching system but at a high level, imagine a map-reduce framework over shards of the user space with each shard containing in-memory some portion of relevant user data that is used in processing various filters and sorts on-the-fly. Searches fan out to all shards and ultimately the results are merged to return the top k candidates. This custom-built matching system has served the team well, so why did we decide to change this system now?

为了支持在未来数年各种基于项目的建议作为球队的发展,我们知道我们需要修补这个系统。One of the biggest pain points was in development as schema updates like adding a new piece of data about a user (e.g. a user’s preferred gender tags) required hundreds to thousands of lines of boilerplate code and deployment required careful coordination to ensure all parts of the system were deployed in the right order. Simply trying to add a new way to filter the user set or to add a new way to rank results required half a day of an engineer's time to manually deploy to every shard in production and remain apprised of issues that might come up; rollbacks weren’t much faster. More importantly, it was becoming difficult to operate and scale the system since shards and replicas were manually allocated and distributed across a fleet of bare metal machines. Early in 2019 as load on the match system increased, we needed to increase search capacity so we added another replica set by manually placing service instances across multiple machines -- a multi-week effort between the backend and operations teams. At this time we also started to notice performance bottlenecks in the inhouse built service discovery system, message queue, etc. While these components had previously served the company well, we were reaching a point in load at which we were uncertain whether any one of these subsystems themselves could scale. We have goals to move more of our workload into a cloud environment and shifting the matching system, itself a laborious task, would also require bringing along all of these other subsystem components.

今天,在许多OkC188bet金宝搏官网upid这些子系统都是由更强大的OSS云友好的场所供应和团队在过去两年采取了各种不同的技术取得了巨大成功。我们不会谈论这个博客帖子这些努力,而是专注于我们已经采取了通过移动到了我们的建议更加开发人员友好的和可扩展的搜索引擎,以解决上述EN-集体问题的努力:胡蜂

这是一个比赛!与胡蜂为188bet金宝搏官网什么OkCupid匹配

从历史上看OkCupid一188bet金宝搏官网直是一个小团队,我们早知道对付搜索引擎的核心将是极其困难和复杂,所以我们看到了开源的选项,我们可以支持我们的用例。两个大的竞争者是Elasticsearch和胡蜂。

Elasticsearch

这是一个大型社区,文档和支持一个受欢迎的选择。有众多的功能和它甚至通过使用火种。在开发经验方面,可以用PUT映射添加新的架构字段,查询可以通过结构化的REST调用来完成,对于查询的时间一定的支持排名,有能力编写自定义插件,等等。当涉及到缩放和维护,人们只需确定碎片的数量和副本为你的系统处理的分布。缩放需要重建具有较高的碎片计数另一个指标。

其中一个原因,我们Elasticsearch的选择退出的最大原因是缺乏真正的内存部分的更新。这是我们的用例非常重要,因为该文件中,我们将分度,我们的用户,将需要通过顺心/传递,信息更新非常频繁,等等。这些文件都在本质上是高度动态的,比较像广告或图片内容这主要是带有属性的更改频繁的静态对象,所以在更新低效的读写周期是我们的一个主要性能问题。

胡蜂

这是开源了仅仅几年以前,声称要支持存储,搜索,排序,并在用户服务时间组织大数据。胡蜂支持

  • 通过真内存部分更新高的进给性能,而不需要重新索引整个文档(据说每节点秒至40-50K更新)
  • 提供了一个灵活的排名框架允许在查询时处理
  • 直接支持在排名的机器学习模型(例如TensorFlow)的集成
  • 查询可以通过REST调用表现YQL(雅虎查询语言)来完成
  • 通过Java组件的能力来定制逻辑

当谈到缩放和维修,你从来没有想过碎片了 - 您配置的内容节点的布局和胡蜂自动处理拆分您的文档集成桶,复制和分发数据。此外,数据会自动康复只要添加副本或删除节点重新分配。缩放仅仅意味着更新配置添加节点,让胡蜂自动重新分配这个数据直播。

总体胡蜂似乎支持我们的使用情况是最好的。188bet金宝搏官网OkCupid包含了很多关于用户的不同信息,帮助他们找到最好的比赛 - 在短短的过滤器条件和排序有超过每100!我们会一直增加更多的过滤和排序,因此能够支持工作流是非常重要的。当它来写入和查询,胡蜂是最类似于我们现有的配套体系;也就是说,我们的配套体系也需要在查询时处理的排名快速内存部分更新和实时处理。胡蜂也有一个更加灵活和简单的排名框架;表达查询的YQL,而不是尴尬的结构Elasticsearch查询的功能只是另一个不错的奖金。当它来扩展和维护,胡蜂的自动数据分发能力受到高度呼吁我们比较小的团队规模。所有的一切就显得胡蜂将为我们提供一个更好的机会在支持我们的使用情况和性能要求,同时更易于比较Elasticsearch时保持。

Elasticsearch更广为人知,我们可以从它的火种的使用学习,但无论哪种选择将需要一吨的前期研究和调查。胡蜂已为许多生产使用情况下,如Zedge,Flickr的服务十亿的图片,并雅虎双子座广告以每秒超过十万请求平台上投放广告1个十亿每月活跃用户。这给了我们信心,这是一个久经考验的,高性能和可靠的选择 - 事实上,胡蜂的起源一直周围长比Elasticsearch。

此外大黄蜂队一直非常投入,乐于助人。胡蜂始建于上投放广告和内容的网页,据我们所知还没有用于交友平台。我们的胡蜂的初始使用挣扎,因为它是这样一个独特的使用情况,但大黄蜂队已经超反应灵敏,快速优化系统来帮助我们处理想出了的几个问题。

如何胡蜂可行,什么搜索看起来像在OkCupid188bet金宝搏官网

建筑

在我们深入到我们的胡蜂的使用情况,这里是关于胡蜂是如何工作的简要概述。胡蜂是许多服务的集合,但每个泊坞容器可以被配置成履行的管理/配置节点,一个无状态的Java容器节点,和/或状态的C ++内容节点的作用。包含配置,部件,ML模型等的应用程序包可以通过部署国家API到配置群集,其中把手将更改应用到容器和内容集群。饲料请求和查询通过HTTP以无状态的Java容器都去(这允许自定义处理),前饲料中的更新内容集群或查询扇出土地到分布式查询的执行发生在内容层。在大多数情况下,部署新的应用程序包只需要几秒钟,胡蜂手柄进行这些更改住人集装箱和内容集群,这样你很少有什么重启。

什么是一个搜索样子?

我们维持胡蜂集群中的文件包含有关给定用户属性的无数。该模式定义定义文档类型的字段,以及排名配置文件包含适用排名表达式的集合。假设我们有一个模式定义表示像这样一个用户:

搜索用户文件{{用户领域的用户id long类型{索引:摘要|属性属性:快速搜索排名:过滤器}场经纬度型位置{索引:属性}#UNIX时间戳字段LASTONLINE型长{索引:属性属性:快速搜索}#包含用户,这个用户文件就喜欢#和相应的权重是UNIX时间戳时等发生的场likedUserSet类型weightedset <长> {索引:属性属性:快速搜索}}秩轮廓myRankProfile继承默认{秩属性{查询(lastOnlineWeight):0查询(incomingLikeWeight):0}功能lastOnlineScore(){表达式:查询(lastOnlineWeight)*新鲜度(LASTONLINE)}函数incomingLikeTimestamp(){表达式:rawScore(likedUserSet)}函数hasLikedMe(){表达式:if(incomingLikeTimestamp> 0,1,0)}函数incomingLikeScore(){表达式:查询(incomingLikeWeight)* hasLikedMe}第一阶段{表达式{lastOnlineScore + incomingLikeScore}}汇总功能{lastOnlineScore incomingLikeScore}}}

索引:属性认证表明这些领域应在内存中保持,使我们能够获得最佳的写入以及对这些领域的读取性能。

假设我们填充了这样的用户文档集群。然后,我们可以做一个搜索过滤和排名在上述任何领域。例如,我们可以做一个POST请求的默认搜索处理机HTTP://本地主机:8080 /搜索/找到用户,除了我们自己的用户777,距离我们的位置50英里的已上线以来的时间戳1592486978,排名由最近的活动,并保持前两名的候选人。让我们也选择summaryfeatures为了帮助我们看到每个等级表达,我们已经在我们的排名配置文件的贡献:

{ “YQL”: “选择用户id,从用户summaryfeatures其中LASTONLINE> 1592486978和(用户ID包含\!” 777 \ “)限2;”, “排行”:{ “轮廓”: “myRankProfile”, “特征”:{“查询(lastOnlineWeight)”: “50”}}, “POS”:{ “半径”: “50mi”, “LL”: “N40o44'22; W74o0'2”, “属性”: “经纬度”},“演示“:{ ”总结“: ”默认“}}

我们可以得到这样的结果:

{ “根”:{ “ID”: “顶层”, “相关性”:1.0, “字段”:{ “TOTALCOUNT”:317}, “覆盖范围”:{ “覆盖”:100, “文档”:958,“全“:真, ”节点“:1, ”结果“:1, ”resultsFull“:1}, ”孩子“:[{ ”ID“: ”指数:用户/ 0 / bde9bd654f1d5ae17fd9abc3“, ”相关性“:48.99315843621399,“源”: “用户”, “字段”:{ “用户id”:-5800469520557156329, “summaryfeatures”:{ “rankingExpression(incomingLikeScore)”:0.0, “rankingExpression(lastOnlineScore)”:48.99315843621399, “vespa.summaryFeatures.cached”:0.0}}},{ “ID”: “指数:用户/ 0 / e8aa37df0832905c3fa1dbbd”, “相关性”:48.99041280864198, “源”: “用户”, “字段”:{ “用户id”:6888497210242094612 “summaryfeatures”:{ “rankingExpression(incomingLikeScore)”:0.0, “rankingExpression(lastOnlineScore)”:48.99041280864198, “vespa.summaryFeatures.cached”:0.0}}}]}}

在匹配命中滤波后的第一阶段排名表达式求值排名命中。该关联返回的整体分数为所有的结果第一阶段在排名功能排名瞩目我们已经在我们的查询,即指定ranking.profilemyRankProfile。在列表中ranking.features我们指定一个功能查询(lastOnlineWeight)50,然后将其在仅排名表达式引用我们使用:lastOnlineScore。利用内置的排名功能新鲜如果在属性时间戳最近相比,目前的时间戳是一个数字接近1。到目前为止好,没有什么太棘手。

不同于静态内容,这些内容会影响他们是否应被你看到。例如,他们可以喜欢你!我们能指数加权集likedUserSet在保存作为键,他们喜欢的用户ID的每个用户的文件和值的时间戳等领域发生的事情。那么这将是直接的过滤器对那些喜欢你(例如添加likedUserSet包含\” 777 \”子句的YQL),但我们怎样才能在排名纳入该加权集信息?我们如何提升已经喜欢我们的用户的用户?

在前面的结果中的排名表达incomingLikeScore是0,这两个命中。用户6888497210242094612实际上已经很喜欢的用户777,但这不是目前在排名接近,即使我们已经提供“查询(incomingLikeWeight)”:50。我们可以使用的功能在YQL(第一,只有第一,参数秩()功能确定文档是否是匹配的,但所有的参数被用于计算秩得分),然后使用dotProduct在我们的YQL排名子句来存储和检索的原始分数(在这种情况下,时间戳当用户喜欢我们)就像这样:

{ “YQL”: “从用户那里选择用户id,summaryfeatures(用户ID包含\!” 777 \ “)和秩(LASTONLINE> 1592486978,dotProduct(likedUserSet,{\” 777 \ “:1}))极限2;”,“排名”:{ “轮廓”: “myRankProfile”, “功能”:{ “查询(lastOnlineWeight)”: “50”, “查询(incomingLikeWeight)”: “50”}}, “POS”:{ “半径”: “50mi”, “LL”: “N40o44'22; W74o0'2”, “属性”: “经纬度”}, “呈现”:{ “摘要”: “默认”}}
{ “根”:{ “ID”: “顶层”, “相关性”:1.0, “字段”:{ “TOTALCOUNT”:317}, “覆盖范围”:{ “覆盖”:100, “文档”:958,“全“:真, ”节点“:1, ”结果“:1, ”resultsFull“:1}, ”孩子“:[{ ”ID“: ”指数:用户/ 0 / e8aa37df0832905c3fa1dbbd“, ”相关性“:98.97595807613169,“源”: “用户”, “字段”:{ “用户id”:6888497210242094612 “summaryfeatures”:{ “rankingExpression(incomingLikeScore)”:50.0, “rankingExpression(lastOnlineScore)”:48.97595807613169, “vespa.summaryFeatures.cached”:0.0}}},{ “ID”: “指数:用户/ 0 / bde9bd654f1d5ae17fd9abc3”, “相关性”:48.9787037037037 “源”: “用户”, “字段”:{ “用户id”:-5800469520557156329, “summaryfeatures”:{ “rankingExpression(incomingLikeScore)”:0.0, “rankingExpression(lastOnlineScore)”:48.9787037037037 “vespa.summaryFeatures.cached”:0.0}}}]}}

现在用户6888497210242094612已经提升到顶部,他们喜欢我们的用户和他们的incomingLikeScore网的全部价值。当然,我们实际上有时间戳时,他们喜欢我们,所以我们可以在更复杂的表达式使用它,但我们会保持它的简单,现在。

这说明了如何通过排名框架过滤和排名结果的机制。排名框架提供的查询时间申请上点击排名表达式(这是大多只是数学)的灵活方式。

自定义的Java中间件层

如果我们希望支持不同的路径,并使每个查询的dotProduct条款隐含的一部分?这就是可定制的Java容器层进来 - 我们可以编写自定义搜索零件。这让我们处理任意参数,重写查询,并处理在某些方面的结果。下面是科特林一个例子:

@After(PhaseNames.TRANSFORMED_QUERY)类MatchSearcher:搜索器(){伴侣对象{// HTTP查询参数val USERID_QUERY_PARAM = “用户ID” VAL ATTRIBUTE_FIELD_LIKED_USER_SET =“likedUserSet”}覆盖乐趣搜索(查询:查询,执行:执行):结果{VAL用户id = query.properties()的getString(USERID_QUERY_PARAM)?toLong()//添加dotProduct子句如果(用户ID!= NULL){VAL rankItem = query.model.queryTree.getRankItem()VAL likedUserSetClause = DotProductItem(ATTRIBUTE_FIELD_LIKED_USER_SET)likedUserSetClause.addToken(用户ID,1)rankItem.addItem(likedUserSetClause)} //执行查询query.trace( “YQL后为:$ {query.yqlRepresentation()}”,2)返回execution.search(查询)}}

那么在我们的services.xml文件中,我们可以按照如下配置这个组件:

... <搜索> <链ID = “默认” 继承= “胡蜂”> <搜索ID = “com.okcupid.match.MatchSearch188bet金宝搏官网er” 捆绑= “匹配搜索器”/>   <处理程序ID = “默认” 捆绑= “匹配搜索器”> <结合> HTTP:// *:8080 /匹配  ...

然后,我们简单地构建和部署应用程序包,现在当我们进行查询,以自定义处理程序HTTP://本地主机:8080 /匹配的用户ID = 777?

{ “YQL”: “从用户那里选择用户id,summaryfeatures(用户ID包含\!” 777 \ “)和秩(LASTONLINE> 1592486978)极限2;”, “排行”:{ “轮廓”: “myRankProfile”,“特征“:{ ”查询(lastOnlineWeight)“: ”50“, ”查询(incomingLikeWeight)“: ”50“}}, ”POS“:{ ”半径“: ”50mi“, ”LL“:” N40o44'22; W74o0“2" , “属性”: “经纬度”}, “呈现”:{ “摘要”: “默认”}}

我们得到相同的结果之前!注意,在科特林代码示例中,我们增加了一个跟踪打印出来的YQL陈述后,我们修改所以如果我们设定TRACELEVEL = 2在网址参数,响应也显示:

... { “消息”: “后YQL是:选择用户id,从用户summaryfeatures其中((秩(LASTONLINE> 1592486978,dotProduct(likedUserSet,{\” 777 \ “:1}))AND(用户ID包含\”777 \ “)限2;”},...

中间件的Java容器层是通过添加自定义逻辑处理的有力途径搜索者或者通过自定义结果的呈现渲染器。我们定制我们搜索办案像上述和其他方面,我们想使隐含在我们的搜索。例如,一个产品概念,我们的支持是“相互配合”的想法 - 你可能会搜索某些偏好准则(如年龄范围和距离)的用户,但你也必须适应候选人的搜索条件。为了支持这样的使用情况在我们的搜索组件我们可以获取搜索用户的文件提供一些属性在随后扇出查询过滤和排名。排名框架和自定义中间件层一起为我们能够支持许多使用情况的灵活方式。我们只涵盖在这些例子中的几个方面,但没有提供丰富的文档这里

如何去建立并productionizing一个胡蜂集群

在2019年春天,我们开始了哈希计划建造这个新系统。在这个时候,我们也伸出手来胡蜂团队,并定期征求他们的意见对我们的使用情况。我们的运营团队估计,并内置了一个初始群集设置和后端团队开始记录,设计,和胡蜂原型各种用例。

早期原型阶段

在Ok188bet金宝搏官网Cupid的后端系统都写在Golang和C ++。为了写在胡蜂自定义逻辑组件,以及使用,以确保高进给的进给率Java的胡蜂HTTP饲料客户端API我们必须得到几分熟悉JVM环境 - 我们结束了利用科特林定制胡蜂组件和我们饲养的管道。

从那里,这是很多移植了多年的应用逻辑,揭示在胡蜂什么是可能的,咨询的胡蜂团队必要的。我们大部分的匹配系统的逻辑是在C ++中,所以我们还增加了逻辑到我们的过滤和排序当前的数据模型转换成等价YQL查询,我们通过REST发出胡蜂集群。在早期,我们还确保打造出一个良好的管道进行重新填充用的文件全部用户群的集群;原型将涉及许多变化,以确定正确的字段类型,利用不经意间需要投喂文件。

监测和负载测试

当我们建立我们的胡蜂搜索群集,我们需要做的两件事情肯定的:它可以处理预计搜索和写入流量,并通过该系统提供的建议,质量比得上现有的匹配系统。

负载测试之前,我们增加了普罗米修斯指标无处不在。胡蜂出口国提供一吨的统计资料和胡蜂本身也暴露一小部分的附加指标。从这里我们通过胡蜂流程等,我们也跑了附近创造了每秒,延迟,资源使用查询各种Grafana仪表盘胡蜂,fbench测试了查询性能,并与大黄蜂队的帮助下确定的,由于相对较高静态查询成本一个分组布局将为我们提供更高的吞吐量。在平坦的布局,添加更多的节点将主要只削减动态查询成本(即依赖于文件索引的号码查询的部分)。分组的布局装置的节点的每一个被配置组将包含完整的文档集合,因此一个单一的基团可以成为一个查询。由于我们的高静态查询成本,同时保持我们的节点数相同,我们通过有效的一组扁平布局增加组数三组更增加了我们的吞吐量。最后,当我们已经获得了在静态基准信心,我们还进行了现场表演的影子流量测试。

性能优化

一个我们早期所面临的最大障碍,然而,在饲料中的性能。在初期,我们遇到了麻烦处理更新的甚至1000个QPS。我们已经大量使用权设定的字段,但这些都不是高性能在第一。幸运的是,大黄蜂队及时帮助解决这些问题以及其他各地的数据分布。从那时起,胡蜂团队还增加了大量的文档上进料尺寸,其中许多我们采用在一定程度上:在大的加权集整数字段时可能的,允许通过设置配料可见延迟利用少数有条件的更新,并具有那些依赖属性(即内存)领域,并通过压缩和我们的饲料管道合并操作减少客户往返。现在管道从容应付在稳定状态下3K QPS和我们微薄的集群已观察到处理11K QPS更新时出现操作无论出于何种原因积压。

建议质量

之后,我们有信心,集群可以处理的负荷,我们需要验证的建议的质量都一样好,如果没有更好的比现有的系统。这是不可能完美地复制现有的所有行为,但在排名如何实现的任何微小偏差就会丰厚的建议的总体质量和一般的整个生态系统的影响。为此,我们将我们的实验系统,其中一些测试组通过胡蜂得到了他们的建议,而对照组则继续利用现有的配套体系。我们分析了几个防守的业务指标,重申和直到从胡蜂组结果观察到一样好,如果没有更好的比,对照组结果修复问题。一旦我们在通过胡蜂提供的结果有信心,我们只是必须的路线推荐查询到胡蜂集群。我们能够交换所有搜索流量胡蜂集群顺利!

系统图

最后,新系统的简化架构概述如下:
OKC-胡蜂架构 - 终极版

如何胡蜂现在正在做的,什么是下一个

让我们比较一下现在胡蜂的支持相比,我们的遗留系统的匹配系统的状态:

  • 架构更新
    • 之前:日历星期花费在几百码的变化线,并与多个子系统细心协调部署
    • 后:几个小时到一个简单的字段添加到架构定义和部署应用程序包
  • 添加一个新的排序
    • 之前:半时间用在部署了一天
    • 后:排名表情也是一个更新的模式定义,可以部署到正在运行的系统。这意味着,只需要几秒钟才能生效!
  • 缩放和维护
    • 之前:多星期的努力手动分发碎片和生产服务的运行文件放置以实现高可用性
    • 后:只需添加新节点配置文件和胡蜂自动分配数据,以满足所需的冗余水平。我们的业务的大部分不需要任何状态节点的任何人工干预或重启

总的来说,胡蜂集群的开发和维护方面是一个福音多少OkCupid的产品路线图。188bet金宝搏官网自2020年起一月底,我们已经产品化我们的胡蜂集群,服务于我们所有的建议,通过了。我们还添加了许多新领域,排名表达式和使用情况,支持重大的产品发布像今年的堆栈。而不像我们以前的匹配系统,我们现在使用机器学习模型住在查询时间。

下一步是什么?

对于我们胡蜂最大的卖点之一是其与张量和集成排名与喜欢的框架训练的模型直接支持TensorFlow。这种能力是我们希望能够继续利用在未来几个月的主要特征之一。我们已经利用张量对于某些使用情况下,我们很高兴能立即进行调查集成更多的机器学习模型,我们希望能更好地预测结果和配合我们的用户。

此外,胡蜂最近发布了高维近似最近邻指数是完全实时,同时搜索和动态更新支持。我们期待着探索其他使用情况的实时最近的邻居搜索。

188bet金宝搏官网OkCupid X胡蜂。装运它!

很多人都听过或Elasticsearch工作,但没有围绕胡蜂大社区。我们相信,有一些已建成Elasticsearch将与胡蜂得到更好的服务很多其他的应用。胡蜂已成为OkCupid的用例一场伟大的比赛,我们很高兴,我们所做188bet金宝搏官网的投资。这种新的架构,使我们能够更快地移动和更迅速地提供新功能。我们是一个相对较小的团队因此它也是伟大的,不必太在乎操作的复杂性。现在我们更多的准备水平扩展我们的搜索能力。我们肯定不会已经能够使我们在过去的一年没有胡蜂取得的进展。欲了解更多信息,胡蜂和技术能力,一定要检查出电子商务搜索和推荐与胡蜂AI通过@jobergum

我们取得了喜欢和发送大黄蜂队的消息的第一个举动。他们传递消息我们回来了,它是一个比赛!我们不能这样做没有胡蜂团队的帮助。特别感谢@jobergum@geirst有关查询和排序的超级特殊大喊答题节目环节提供指导@kkraune@vekterli们的支持。的支持和努力的团队为我们提供的水平是真正真棒,从深挖掘到我们的用例来诊断性能问题,在很短的时间胡蜂引擎制作的增强。@vekterli甚至飞到了我们的办公室在纽约直接与我们合作了一个星期,以确保我们的集成和使用情况都可以得到满足。非常感谢你的团队在胡蜂!

最后,我们只是触及了我们的使用胡蜂的几个方面,但没有这本来是可以不通过我们的后台和运营团队在过去一年中的大量工作。已经有我们所面临的桥接和更现代的技术堆栈我们现有的系统之间的差距众多独特的挑战,但这些都是另一次博客文章。

如果你有兴趣的挑战后端团队OkCupid正在研究,188bet金宝搏官网我们正在招聘