【问题标题】:MongoDB fulltext search: Overflow sort stage buffered data usageMongoDB全文搜索:溢出排序阶段缓冲数据使用
【发布时间】:2016-01-15 03:42:43
【问题描述】:

我正在尝试在我的 node(express.js) 应用程序中实现 mongo 文本搜索。

这是我的代码:

Collection.find({$text: {$search: searchString}}
, {score: {$meta: "textScore"}})
.sort({score: {$meta: 'textScore'}})
.exec(function(err, docs {

//Process docs
});

在大型数据集上执行文本搜索时出现以下错误:

MongoError:执行程序错误:溢出排序阶段缓冲数据使用量 33554558 字节超出内部限制 33554432 字节

我知道 MongoDB 最多可以对 32MB 数据进行排序,并且可以通过为我们将用于排序集合的字段添加索引来避免此错误。但在我的情况下,我按textScore 对集合进行排序,我不确定是否可以为该字段设置索引。如果没有,是否有任何解决方法?

注意:我知道在 SO 上有类似的问题,但这些问题中的大多数没有 textScore 作为排序标准,因此我的问题不同。

【问题讨论】:

    标签: node.js mongodb full-text-search text-search


    【解决方案1】:

    您可以使用聚合来规避限制。

    Collection.aggregate([
        { $match: { $text: { $search: searchString } } },
        { $sort: { score: { $meta: "textScore" } } }
    ])
    

    $sort 阶段有 100 MB 的限制。如果您需要更多,可以使用allowDiskUse,它将在排序时写入临时文件。为此,只需将 allowDiskUse: true 添加到聚合选项即可。

    如果您的结果大于 16MB(即 MongoDB 的文档大小限制),您需要请求一个游标来遍历您的数据。只需在您的 exec 之前添加 .cursor(),这是一个详细的示例。 http://mongoosejs.com/docs/api.html#aggregate_Aggregate-cursor

    【讨论】:

    • 感谢您的回答,我尝试使用聚合函数传递allowDiskUse 选项,但如果预期有很多搜索结果,我会收到以下错误:“聚合失败:{“errmsg”:“异常:聚合结果超过最大文档大小 (16MB)", "code": 16389, "ok": 0 }"
    • 忽略它。显然,您的结果现在大于 16MB。更新我的原始答案以修复它。
    • 是的聚合查询结果大于16MB。
    • cursor 有效,但在我的情况下使用光标并不是最好的方法。我会看看我是否能找到适用于find 的东西。
    • 你的最终目标是什么?
    猜你喜欢
    • 2015-02-02
    • 2014-10-22
    • 2017-03-23
    • 2015-01-17
    • 2015-08-03
    • 1970-01-01
    • 2015-04-03
    相关资源
    最近更新 更多