MongoDB全文搜索不使用索引

时间:2014-07-18 12:53:51

标签: mongodb search indexing mongodb-query full-text-search

我们使用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
}

1 个答案:

答案 0 :(得分:0)

请查看您提出的问题:

  

“....该集合包含89.114.052个文档,我怀疑是不使用全文索引....”

133212文档只是“nScanned”。当然使用索引。如果不是那么89,114,052个文件(因为这是英语语言环境而不是德语)会在“nScanned”中报告,这意味着不使用索引。

您的查询很慢。好吧,似乎你的硬件不能完成将1333212文件保存在内存中或者使超高速磁盘有效地“分页”的任务。但这不是MongoDB问题,而是你的问题。

您有超过100,000个与您的查询相匹配的文档,即使您只需要100,那么您需要接受这是如何工作的,并且一旦您匹配100个文档和控制权,MongoDB就不会“放弃”。此处的查询模式找到匹配的全部,然后将“限制”应用于游标,以便返回最新的。

将来可能会有一段时间“文本”功能可能允许您执行$geoNear的聚合版本中可以执行的操作,并为“分数”指定“最小”和“最大”值为了改善结果。但是现在它没有。

因此,如果您的问题是在超过89,000,000个文档中匹配超过100,000个文档的速度缓慢,请升级您的硬件或使用外部文本搜索解决方案。