在MongoDB 2.6 $ maxScan无法使用$ text查询

时间:2014-04-18 16:03:50

标签: mongodb

我有一个带文本索引的MongoDB数据库。我想限制在执行文本搜索时扫描的文档数量,以保证性能。但是,两者都是:

db.collection.find({$text:{$search:"something"}}).explain()

db.collection.find({$text:{$search:"something"}})._addSpecial({"$maxScan":1}).explain()

给我相同的结果:

{
    "cursor": "TextCursor",
    "n": 6672,
    "nscannedObjects": 6672,
    "nscanned": 6672,
    "nscannedObjectsAllPlans": 6672,
    "nscannedAllPlans": 6672.
    "scanAndOrder": false,
    "nYields": 104,
    "nChunkSkips": 0,
    ...
}

第二个查询不应该只扫描单个文档吗?更一般地说,假设使用limit()无法解决问题,我怎样才能确保我的搜索不会花费很长时间?

但是,当我尝试使用另一个非文本查询时,它会按预期工作。

我正在使用MongoDB 2.6

1 个答案:

答案 0 :(得分:0)

可能没有这样记录,但这在逻辑上是设计的。

虽然在统一索引API方面做了大量的工作,(因此现在类似的查询结构),像“文本”和“地理空间”索引这样的东西实际上与一般的B树不同表亲。

这两种类型的目的都是为了一种“模糊匹配”逻辑,它找到与查询中给出的术语“接近”或“相似”的东西。

因此,对于扫描的条目数量并没有真正的“限制”类似,而不是“文本”索引。对于“地理”类型的查询,通常存在“maxDistance”的概念,可用于定义对“距离多远”可以考虑的“距离”的限制。

但是对于文本来说,没有真正的内置限制器来限制匹配的“术语”,正如开头所指出的那样,实际上不同于对线性扫描的限制。

MongoDB中的文本索引很年轻,未来可能会有一些功能,但就像“geo”一样,它不太可能是$maxScan而是其他一些专门术语。

如果您需要更好的性能,请查看MongoDB外部的“完整版”文本搜索解决方案。