首页 > 解决方案 > mongodb 无法依靠搜索结果

问题描述

我收集了大约 2 亿份文档。我有一个文本索引和基本搜索,例如:

db.MyCol.find({$text: { $search : "word" }})

工作正常并在几秒钟内完成。

但是,某些操作需要不确定的时间。例如,如果我想对结果进行分页,那么我会尝试获得如下总计数:

db.MyCol.find({$text: { $search : "word" }}).count()

然后这永远不会完成。我等了一个小时然后放弃了。我需要在请求范围内的这些数据。理想情况下几秒钟,最坏几分钟。

我试图解释查询以查看发生了什么,但我得到了完全相同的处理,当我尝试时它只是坐在那里旋转:

db.MyCol.find({$text: { $search : "word" }}).explain()

或者

db.MyCol.find({$text: { $search : "word" }}).count().explain()

我也尝试过以下问题以通过聚合获得它:

db.MyCol.aggregate(
   [
     { $match: { $text: { $search: "word" } } },
     { $group: { _id: null, count: { $sum:1 } } }
   ], { "allowDiskUse" : true }
)

但同样,它似乎需要永远完成。

如何对大型集合的文本搜索进行分页?

标签: mongodb

解决方案


看看 $facet 是否可以表现得更好

db.MyCol.aggregate(
    [
        {
            "$match": { "$text": { "$search": "word" } }
        },
        {
            "$facet": {
                "count": [
                    {
                        "$count": "count"
                    }
                ],
                "items": [
                    {
                        "$skip": 0
                    },
                    {
                        "$limit": 100
                    }
                ]
            }
        }
    ]
)

推荐阅读