如何按位置和日期范围有效搜索大型数据集?

时间:2012-01-19 18:13:15

标签: algorithm search mongodb search-engine geospatial

我有一个包含以下属性的MongoDB集合:

longitude, latitude, start_date, end_date, price

我有超过5亿份文件。

我的问题是如何尽可能有效地搜索纬度/经度,日期范围和价格? 我认为我的选择是:

  1. 在lat / long上创建地理空间索引并使用MongoDB的邻近搜索...然后根据日期范围和价格对其进行过滤。
    • 我还没有对此进行测试,但我担心当我们每秒进行大约1次搜索时,数据量太大而无法快速搜索。
    • 您是否有过在这种情况下MongoDB会如何反应的经验?
  2. 按位置将数据拆分为多个集合。即通过london_collection,paris_collection,new_york_collection这样的城市。
    • 然后我必须首先通过lat / long查询,找到最近的城市集合,然后使用日期和价格过滤器对该集合中的子集数据进行MongoDB空间搜索。
    • 我的文件分布不均匀,因为有些城市的文件数量会比其他城市多。
  3. 按日期而非位置创建集合。与上述相同,但每个文档都根据其日期范围分配了一个集合。
    • 搜索的问题是日期范围跨越多个集合。
  4. 为每个文档创建基于city_start_date_end_date的唯一ID。
    • 我再次使用我的lat / long查询来查找最近的城市附加日期范围来访问密钥。这似乎相当快,但我不喜欢这个城市看起来方面......看起来有点难看。
  5. 我正在尝试选项1。)但是在我走得太远之前,我真的想听听你的想法吗?

    搜索引擎如何拆分和管理他们的数据......这一定是类似的问题?

    此外,我不必使用MongoDB,我对其他选项持开放态度?

    非常感谢。

2 个答案:

答案 0 :(得分:2)

索引和数据访问性能是一个深刻而复杂的主题。许多因素都会影响最有效的解决方案,包括数据集的大小,读写比,IO和后备存储的相对性能等。

虽然我无法给你一个具体的答案,但我可以建议使用morton数作为拉取多个类似数值的有效方法,比如lat longs。

Morton number

答案 1 :(得分:1)

为什么你认为选项1会太慢?这是真实世界测试的结果还是仅仅是假设它最终可能无法解决?

MongoDB本身支持geohashing并将坐标转换为单个数字,然后可以通过BTree遍历进行搜索。这应该相当快。对我来说,弄乱多个收藏品似乎不是一个好主意。它所做的就是用一些你需要编写,测试和维护的代码替换数据库上的一个BTree遍历级别。

不要重新发明轮子,但首先尝试优化最明显的路径(1):

  1. 设置地理位置索引
  2. 使用explain确保您的查询实际使用索引
  3. 确保您的索引适合RAM
  4. 使用built-in profiler
  5. 配置数据库
  6. 不要测量索引没有机会进入RAM的“冷”系统的性能
  7. 如果可能的话,尽量不要使用geoNear,并坚持更快(但不是完美的球形)near查询
  8. 如果您仍在达到限制,请查看sharding以分发对多台计算机的读写操作。