MongoDB全文搜索:溢出排序阶段缓冲数据使用

时间:2015-10-16 11:39:59

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

我正在尝试在我的节点(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作为排序标准,因此我的问题不同。

1 个答案:

答案 0 :(得分:1)

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

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

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

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