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

时间:2015-08-07 17:17:10

标签: mongodb geospatial

鉴于集合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到很多秒。请参阅此示例,其中唯一的区别是名称索引上的一个额外字符实际上会增加时间:

200ms的:

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

18,000ms:

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

我无法理解为什么更具体的索引会让事情变得如此之慢。当我使用短语更具体时,我必须在查询返回之前的任何合理时间内将$maxDistance大幅减少到7,000米。

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

1 个答案:

答案 0 :(得分:0)

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

  

有一个"高地人规则" (查询中只能有一个)   否认使用超过" one" "特别"索引   查询评估。所以你不能有多个"文本"或多愁   "地理空间"或者" text"的任意组合和#34;地理空间"或使用   $或条件中的任何一个,导致多个索引   选择。

因此,我选择转移到Elasticsearch以获取此特定查询,仅索引完成这些多索引查询所需的内容,然后使用这些结果加载必要的Mongo文档。工作迅速,运作良好。