MongoDB 全文搜索:溢出排序阶段缓冲数据使用
MongoDB fulltext search: Overflow sort stage buffered data usage
我正在尝试在我的节点 (express.js) 应用程序中实现 mongo 文本搜索。
这是我的代码:
Collection.find({$text: {$search: searchString}}
, {score: {$meta: "textScore"}})
.sort({score: {$meta: 'textScore'}})
.exec(function(err, docs {
//Process docs
});
在大型数据集上执行文本搜索时出现以下错误:
MongoError: Executor error: Overflow sort stage buffered data usage of 33554558 bytes exceeds internal limit of 33554432 bytes
我知道 MongoDB 最多可以对 32MB 的数据进行排序,并且可以通过为我们将用于排序集合的字段添加索引来避免此错误。但在我的例子中,我按 textScore
对集合进行排序,我不确定是否可以为此字段设置索引。如果没有,是否有任何解决方法?
注意: 我知道在 SO 上有类似的问题,但其中大多数问题没有 textScore
作为排序标准,因此我的问题是不同的。
可以使用聚合来规避限制。
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
我正在尝试在我的节点 (express.js) 应用程序中实现 mongo 文本搜索。
这是我的代码:
Collection.find({$text: {$search: searchString}}
, {score: {$meta: "textScore"}})
.sort({score: {$meta: 'textScore'}})
.exec(function(err, docs {
//Process docs
});
在大型数据集上执行文本搜索时出现以下错误:
MongoError: Executor error: Overflow sort stage buffered data usage of 33554558 bytes exceeds internal limit of 33554432 bytes
我知道 MongoDB 最多可以对 32MB 的数据进行排序,并且可以通过为我们将用于排序集合的字段添加索引来避免此错误。但在我的例子中,我按 textScore
对集合进行排序,我不确定是否可以为此字段设置索引。如果没有,是否有任何解决方法?
注意: 我知道在 SO 上有类似的问题,但其中大多数问题没有 textScore
作为排序标准,因此我的问题是不同的。
可以使用聚合来规避限制。
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