如何通过地理空间索引和文本索引快速查询MongoDB集合



给定集合locations,包含约20,000,000个文档,具有3个属性:

{
    _id,
    name, // string
    geo // coordinate pair, e.g. [-90.123456, 30.123456]
}

和索引name: 1和地理索引设置如下:

{ 
    "geo" : "2dsphere"
},
{ 
    "v" : 1, 
    "name" : "geo_2dsphere", 
    "ns" : "db.locations", 
    "min" : "-180.0", 
    "max" : "180.0", 
    "w" : 1.0, 
    "2dsphereIndexVersion" : 2
}

我如何在geo_2dsphere索引和name索引上对这个集合进行性能查询?

当我只在地理索引上运行$box查询时,返回50个结果需要20多秒。当我对name属性进行搜索时,它会进一步上升。

如果我运行一个$near查询,那么事情可以执行得非常快,但有时查询似乎(非常随机)从~200ms到许多秒。看看这个例子,唯一的区别是在name索引上增加了一个字符,这实际上增加了时间:

200 ms:

{name: /^mac/, geo: {$near: {$geometry: {type: "Point", coordinates: [ -90.123456, 30.123456 ]}, $maxDistance: 20000}}}

18000 ms:

 {name: /^macy/, geo: {$near: {$geometry: {type: "Point", coordinates: [ -90.123456, 30.123456 ]}, $maxDistance: 20000}}}

我不明白为什么更具体的索引会减慢速度。当我更具体地使用一个短语时,我必须在查询在任何合理的时间内返回之前将$maxDistance大幅减少到7,000米左右。

我应该在这里做更好的设置吗?

正如blake Seven向我指出的那样,您无法在MongoDB中搜索多个索引:

查询中有一个"高级规则"(只能有一个)拒绝在中使用多个"特殊"索引的计算查询求值。所以你不能有多个"文本"或多个"地理空间"或"文本"one_answers"地理空间"的任何组合或使用在$或条件中的任何一个,导致多个索引选择。

因此,我选择将此特定查询转移到Elasticsearch,仅索引完成这些多索引查询所需的内容,然后使用这些结果来加载必要的Mongo文档。见效快,效果好

最新更新