2015-10-16 29 views
2

我试图在我的节点(express.js)应用程序中实现mongo文本搜索。MongoDB全文搜索:溢出排序阶段缓冲数据使用

这里是我的代码:

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,我不确定是否有可能为此字段设置索引。如果没有,是否有任何解决方法?

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

回答

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

+0

谢谢你的回答,我试着通过带有聚合函数的'allowDiskUse'选项,但是如果有很多预期的搜索结果,我会收到跟随错误:“聚合失败:{errmsg”:“异常:聚合结果超过最大文档大小(16MB)“, ”code“:16389, ”ok“:0 }” – Raeesaa

+0

忽略该项。显然,你的结果现在大于16MB。更新我的原始答案来修复它。 –

+0

是的聚合查询结果大于16MB。 – Raeesaa