首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过地理空间索引和文本索引快速查询MongoDB集合?

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

Stack Overflow用户
提问于 2015-08-07 17:17:09
回答 1查看 174关注 0票数 1

假定集合locations由具有3个属性的大约20,000,000份文档组成:

代码语言:javascript
复制
{
    _id,
    name, // string
    geo // coordinate pair, e.g. [-90.123456, 30.123456]
}

name: 1索引和geo索引设置如下:

代码语言:javascript
复制
{ 
    "geo" : "2dsphere"
},
{ 
    "v" : 1, 
    "name" : "geo_2dsphere", 
    "ns" : "db.locations", 
    "min" : "-180.0", 
    "max" : "180.0", 
    "w" : 1.0, 
    "2dsphereIndexVersion" : 2
}

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

当我只对geo索引运行$box查询时,返回50个结果需要超过20秒。当我包括对name属性的搜索时,它会进一步上升。

如果我运行一个$near查询,那么执行起来非常快,但有时查询似乎(非常随机)从200 If到多秒。请参见此示例,其中唯一的区别是名称索引上增加了一个字符,这实际上增加了时间:

200:

代码语言:javascript
复制
{name: /^mac/, geo: {$near: {$geometry: {type: "Point", coordinates: [ -90.123456, 30.123456 ]}, $maxDistance: 20000}}}

18 000毫秒:

代码语言:javascript
复制
 {name: /^macy/, geo: {$near: {$geometry: {type: "Point", coordinates: [ -90.123456, 30.123456 ]}, $maxDistance: 20000}}}

我不明白为什么更具体的指数会使事情如此缓慢。当我更具体地使用一个短语时,在查询返回之前,我必须在任何合理的时间内将$maxDistance大幅度减少到大约7,000米。

我应该在这里做更好的安排吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-13 19:26:28

正如布莱克七向我指出的那样,您不能在MongoDB中搜索多个索引:

查询计算中有一个"highlander规则“(只能有一个),它拒绝在查询计算中使用”一个以上“”特殊“索引。因此,您不能有多个“文本”或多个“地理空间”或“文本”和“地理空间”的任何组合,也不能使用$or条件中的任何内容,从而导致多个索引选择。

因此,我选择使用Elasticsearch来查询这个特定的查询,只对完成这些多索引查询所需的内容进行索引,然后使用这些结果加载必要的Mongo文档。动作快,效果好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31883280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档