【问题标题】:In MongoDB 2.6 $maxScan not working with $text query在 MongoDB 2.6 中,$maxScan 不能与 $text 查询一起使用
【发布时间】:2014-04-18 16:03:50
【问题描述】:

我有一个带有文本索引的 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

【问题讨论】:

    标签: mongodb


    【解决方案1】:

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

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

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

    因此,对于扫描条目的数量并没有真正的“限制”,无论如何也不是“文本”索引。对于“geo”类型的查询,通常有一个“maxDistance”的概念,可用于定义“近”点可以考虑的“距离”的限制。

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

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

    如果您需要更好的性能,请研究 MongoDB 外部的“成熟”文本搜索解决方案。

    【讨论】:

      猜你喜欢
      • 2014-11-12
      • 2019-11-15
      • 1970-01-01
      • 2015-10-01
      • 2020-10-18
      • 1970-01-01
      • 1970-01-01
      • 2014-06-21
      • 2022-12-04
      相关资源
      最近更新 更多