【问题标题】:Searching for nearest regions by name in MongoDB在 MongoDB 中按名称搜索最近的区域
【发布时间】:2020-07-27 09:52:45
【问题描述】:

我想为用户附近的区域实施自动完成建议。因此,对于位于旧金山的用户输入“Union Sq”,它可能会建议“Union Square, SF”然后是 Union Square, NY”。这是由一个区域表支持的,其中包括名称、质心和几何。表的大小将是大约 500k 条目,名称上有一个标准(词法)索引,质心上有一个 2dsphere 索引。如何以高效的方式实现这一点?

使用下面的查询,MongoDB 似乎总是使用地理空间索引,这导致运行时间 > 1s。

{
    "name": {
        "$regex": "^Union Sq"
    },
    "centroid": { 
        "$near": {
            "$geometry": { "type": "Point", "coordinates": [-122.39986, 37.75716] }
        }
    }
}

如果我使用 $maxDistance 将结果限制在 100 英里半径范围内,性能会显着提高,但是如果用户的目标是更远的区域,我将需要一个使用 $minDistance 进行二次非性能查询的系统。我想我可以实现 UI,使二级查询纯粹是词法的,这将允许用户在输入足够多的区域名称后最终找到遥远的区域,但对这些名称进行近似排序将是理想的。

使用下面的查询,如果建议接近,MongoDB 似乎表现得相当不错,但是当它需要从更多区域拉取以满足限制时,性能会有所下降。

regions = await Region.aggregate([
    {
        $geoNear: {
            near: {
                type: "Point", coordinates: [-122.39986, 37.75716]
            },
            key: "centroid",
            distanceField: "dist.calculated",
            query: {
                name: { $regex: '^Union Sq' }
            }
        }
    },
    { $limit: 5 }
]);

有没有更好的方法来做到这一点?次要问题包括:

  • 是否可以让 MongoDB 先使用词法索引,然后对这些结果进行地理排序?不管上面的第一个查询是什么,MongoDB 似乎总是使用地理索引。
  • 这当然不是关键,但理想情况下,我想使用实际几何而不是质心进行排序以获得更准确的结果...这可以以高效的方式完成吗?

【问题讨论】:

    标签: mongodb geospatial


    【解决方案1】:

    不确定 MongoDB 上是否有更好的解决方案,但我只是将数据移植到 Postgres,上面的第一个查询速度非常快……更不用说其他一些好处(例如,MongoDB 对多边形非常挑剔) .对于处于相同情况的任何人来说,这也是一个有用的链接:

    https://postgis.net/workshops/postgis-intro/knn.html

    【讨论】:

      猜你喜欢
      • 2020-05-10
      • 2020-05-05
      • 2022-12-01
      • 2020-10-24
      • 2014-05-27
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 2017-11-30
      相关资源
      最近更新 更多