2

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

4

1 回答 1

1

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

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

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

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

于 2015-10-19T19:19:41.520 回答