【发布时间】:2019-02-06 19:00:16
【问题描述】:
我一直对 MongoDB 中的全文搜索性能非常不满意,因此我一直在寻找开箱即用的解决方案。相对较小的 2500 万个文档集合分布在 8 台强大的机器上(4 个具有冗余的分片),我看到一些查询需要 10 秒。那太可怕了。在云雀上,我尝试了 10 秒直接查询分片,似乎 mongos 将查询串行发送到分片,而不是并行发送。在 4 个分片中,我看到一个分片的搜索时间为 2.5 秒,而其他 3 个分片的搜索时间各不到 2 秒。总共不到 8.5 秒,但通过 mongos 花了 10 秒。掌心。
有人可以确认这些对分片的查询是连续运行的吗?或者提供一些其他的解释?
直接查询分片有哪些陷阱?
我们在 4.0 上,查询看起来像这样:
db.items.aggregate(
[
{ "$match" : {
"$text" : { "$search" : "search terms"}
}
},
{ "$project": { "type_id" : 1, "source_id": 1 } },
{ "$facet" : { "types" : [ { "$unwind" : "$type_id"} , { "$sortByCount" : "$type_id"}] , "sources" : [ { "$unwind" : "$source_id"} , { "$sortByCount" : "$source_id"}]}}
]
);
我之前犯了一个错误,这是正在发送的查询有问题。我与一位 MongoDB 专家交谈,并了解了正在发生的事情的很大一部分(我认为),但很高兴看到其他人不得不说什么,以便我可以支付赏金并将其正式公布。
【问题讨论】:
-
你的 mongo 版本是什么?你的查询是什么样的?它是否使用其他条件而不是 $search,或额外的排序?
-
更新了描述。
-
您能否详细介绍一下您是如何创建文本索引的?你的分片是如何组织的?你有副本集(有多少)?
-
如果知道哪些查询需要更长的时间,您应该检查这些查询是否使用 btreeCursor 使用 db.collectionName.find({Query}).explain()
-
@ChrisSeline 你如何衡量你的查询时间?我很确定 scatter-gather 是并行运行的
标签: mongodb full-text-search sharding