【发布时间】:2014-09-09 14:58:38
【问题描述】:
我们使用 mongoDB 全文搜索在我们的数据库中查找产品。 不幸的是,它慢得令人难以置信。 该集合包含 89.114.052 个文档,我怀疑未使用全文索引。 使用 explain() 执行搜索,nscannedObjects 返回 133212。 如果使用索引,这不应该是 0 吗?
我的索引:
{
"v" : 1,
"key" : {
"_fts" : "text",
"_ftsx" : 1
},
"name" : "textIndex",
"ns" : "search.products",
"weights" : {
"brand" : 1,
"desc" : 1,
"ean" : 1,
"name" : 3,
"shop_product_number" : 1
},
"default_language" : "german",
"background" : false,
"language_override" : "language",
"textIndexVersion" : 2
}
完整的测试搜索:
> db.products.find({ $text: { $search: "playstation" } }).limit(100).explain()
{
"cursor" : "TextCursor",
"n" : 100,
"nscannedObjects" : 133212,
"nscanned" : 133212,
"nscannedObjectsAllPlans" : 133212,
"nscannedAllPlans" : 133212,
"scanAndOrder" : false,
"nYields" : 1041,
"nChunkSkips" : 0,
"millis" : 105,
"server" : "search2:27017",
"filterSet" : false
}
【问题讨论】:
-
如果有有效的索引使用,nscannedObjects 实际上不会是 100?
-
我不详细了解mongoDB的内部实现,但是只使用索引字段,应该是0,因为没有扫描任何文档。他们可能会再次检查结果中的所有文档,以排除由于相似词干而添加的结果。但是 133212 个文档中只有 100 个真正匹配?
-
你的限制是 100,这就是为什么 n 是 100
-
正确。但它是关于 nscannedObjects / nscanned 以及是否使用索引。我只使用了 limit(100) 让它更快一点,因为没有排序......仍然需要大约 20 秒。
-
实际上,由于我自己的测试,这让我有点困惑。在我自己的测试下,如果限制正确应用于索引,那么扫描的对象也应该是 100
标签: mongodb search indexing mongodb-query full-text-search