Booking.com如何在毫秒内搜索数百万个地点

简介: Booking.com如何在毫秒内搜索数百万个地点

译自:How Booking.com Searches Through Millions of Locations in Milliseconds


Booking.com是一家与酒店、旅馆、度假租赁等相关的在线旅行社。每个月都有数亿用户通过访问该网站来寻找合适的度假住宿。Booking的一个主要特性是可以以地图的方式提供查找服务,其地图市场提供了上千万套房产,用户可以通过地图查找到:


  • 提供租赁房产的位置
  • 附近感兴趣的地方(博物馆、沙滩、历史建筑等)
  • 租赁房产与感兴趣的地方的距离


为实现此需求,需要能够快速加载地图,其后端需要搜索世界各地数百万个不同的点。


Igor Dotsenko 写了一篇博客来探究他们是如何实现该目标的。

在地图上查找

当用户打开地图查找房产时,会出现一个有边界的框,此时需要在边框内展示感兴趣的点,这样Booking才能在该框中快速查找最感兴趣的点。

Quadtrees(四叉树)

底层数据结构采用的是Quadtree。Quadtrees是一种树,特别适用于2D空间数据,如地图、图像、视频游戏等。通过Quadtrees可以实现高效地插入/删除点操作、快速范围查找、最近邻搜索等。


Quadtrees和其他树结构一样存在父子节点。对于一个Quadtrees,其内部节点总是包含4个子节点(内部节点即非叶子的节点,叶子节点没有子节点)。父节点表示一个特定的2D区域空间,每个子节点表示该区域的象限。

当处理地图数据时,父节点表示地图上的某些区域,其4个子节点分别表示父区域的西北、东北、西南和东南四个象限。


对于Booking,每个节点表示地图上的特定有界框,用户可以通过在地图上放大或平移来修改可见的有界框。节点的每个子节点将西北、东北、西南和东南边界框保持在父节点的边界框内。


每个节点还包含少量标记(代表感兴趣的地点),每个标记会分配一个重要值,重要值大的标记被分配给树中更高的节点(即根节点中的标记是最重要的)。

下面看下Booking是如何查找、构建和更新Quadtree的。

查找Quadtree

当用户选择一个特定的有界框时,Booking会从Quadtree 中为该有界框查找最重要的标记,因此使用了广度优先查找(从上往下按照重要度查找到一定数目的标记)。


首先从根节点开始查找与选择的有界框交叉的标记,如果需要更多的标记,则会继续查找与有界框交叉的子节点,并将其添加到队列中。使用先进先出的顺序处理队列中的节点(查找和有界框交叉的标记)。一旦查找到足够(等于请求数目)的标记,则结束查找并将结果发送给用户(展示在地图上)。

构建Quadtree

本段内容来自该博客

Quadtree保存在内存中,且会时不时地通过重建来添加新的标记(或修改标记的重要程度)。

一开始只有一个表示整个世界的根节点,且为空。为了使用标记构建树,需要通过遍历所有标记来将其插入到树中。假设每个节点最多可以包含10个标记,每次插入时:

  1. 将当前标记放到当前节点的标记集中
  2. 如果当前标记的数目<=10,则插入结束,遍历下一个标记
  3. 如果当前标记的数目>10,则需要从该节点中找到重要值最低的标记,并将其放到子节点中(越靠近根节点的节点,其标记的重要值越高)
  • 如果该节点没有子节点,则需要创建子节点(将节点的有界框分为4个子有界框,即4个子节点)
  • 从子节点中查找与有界框重要值最低的标记相交的节点
  • 将此标记递归放入子节点(即重复第一个步骤)

结果

Booking通过创建更多的Quadtree,并让每个Quadtree负责特定的地理区域来实现水平伸缩。对于存储了300,000个标记的Quadtree,其p99检索速度小于5.5毫秒。

目录
相关文章
|
2月前
|
人工智能 机器人
Kimi仅用5秒钟就帮我抓取了5页文章素材
Kimi仅用5秒钟就帮我抓取了5页文章素材
63 3
|
网络架构
小区搜索过程
小区搜索是终端通过同步信号块SSB与小区建立联系的过程,包括取得小区下行频率、时间同步、检测小区识别号CellID、通过解码广播信道BCH上的系统信息。下行同步包括频率、符号和帧同步。
217 0
小区搜索过程
|
存储 前端开发 算法
「干货」面试官问我如何快速搜索10万个矩形?——我说RBush
前言 亲爱的coder们,我又来了,一个喜欢图形的程序员👩‍💻,前几篇文章一直都在教大家怎么画地图、画折线图、画烟花🎆,难道图形就是这样嘛,当然不是,一个很简单的问题, 如果我在canvas中画了10万个点,鼠标在画布上移动,靠近哪一个点,哪一个点高亮。有同学就说遇事不决 用for循环遍历哇,我也知道可以用循环解决哇,循环解决几百个点可以,如果是几万甚至几百万个点你还循环,你想让用户等死?这时就引入今天的主角他来了就是「Rbush」 rbush 我们先看下定义,这个rbush到底能帮我们解决了什么问题? RBush是一个high-performanceJavaScript库,用于点和
「干货」面试官问我如何快速搜索10万个矩形?——我说RBush
|
数据采集 机器学习/深度学习 编解码
神马搜索如何提升搜索的时效性?
什么是搜索的时效性?有哪些特征?如何优化?本文分享神马搜索在搜索排序时效性问题上的实践和探索,从基础特征优化开始,通过标注数据进行排序和召回模型优化,以及时效性排序的召回体系和收录体系。较长,同学们可收藏后再看。
2934 0
神马搜索如何提升搜索的时效性?
|
存储 小程序
小程序实现搜索历史记录,去重搜索字段以及限制展示字段数量
小程序实现搜索历史记录,去重搜索字段以及限制展示字段数量
1388 0
|
搜索推荐
百度下拉框与相关搜索出现的负面信息,要怎么删除?
用户在互联网上口碑宣传,沉淀了大量的不正面信息,百度快照收录后,一旦给予较好的搜索排名,自然下拉框和相关搜索推荐关键词也会自动出现,不及时处理,随着其他网站抓取和采集内容,负面效应会越来越大。 我们用百度在搜索企业或者品牌名称的时候,百度下拉框会跳出一些“提示词”,同时网页底部的“相关搜索”也会出现相关关键词,对企业来说这种信息展示是非常优越的,是一种品牌的象征,具有很好的商业价值。
246 0
|
搜索推荐 UED
影响搜索排名的用户行为
可以影响排名的用户行为如下。 1.网站流量和Alexa排名 这两个因素是最直接、误差最大的因素,其中Alexa排名因为其样本分布不均匀、容易作弊等特点,与网站真实流量往往有很大的误差,不过总体流量也是在一定程度上说明网站的受欢迎程度,因此这一类用户行为的总和也是在影响着排名的。
156 0
|
JavaScript 前端开发 关系型数据库