我有一个带文本索引的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
答案 0 :(得分:0)
可能没有这样记录,但这在逻辑上是设计的。
虽然在统一索引API方面做了大量的工作,(因此现在类似的查询结构),像“文本”和“地理空间”索引这样的东西实际上与一般的B树不同表亲。
这两种类型的目的都是为了一种“模糊匹配”逻辑,它找到与查询中给出的术语“接近”或“相似”的东西。
因此,对于扫描的条目数量并没有真正的“限制”类似,而不是“文本”索引。对于“地理”类型的查询,通常存在“maxDistance”的概念,可用于定义对“距离多远”可以考虑的“距离”的限制。
但是对于文本来说,没有真正的内置限制器来限制匹配的“术语”,正如开头所指出的那样,实际上不同于对线性扫描的限制。
MongoDB中的文本索引很年轻,未来可能会有一些功能,但就像“geo”一样,它不太可能是$maxScan
而是其他一些专门术语。
如果您需要更好的性能,请查看MongoDB外部的“完整版”文本搜索解决方案。