我正在尝试使用 mongodb 3.4、nodejs 和 socket.io 实现全文搜索,并进行区分和排序。到目前为止一切顺利,我的代码可以正常工作,但没有排序部分:
socket.on('searchProductName', function (data) {
MongoClient.connect(config.database.url, function (err, db) {
db.collection(config.database.collection.products).distinct('productName',
{
$text: {$search: data}}, {score: {$meta: "textScore"}
},
function (err, doc) {
socket.emit('searchProductNameResults', doc);
db.close();
});
});
});
我正在尝试找到一种基于 textScore 排序方法来使用它的方法,但对于不同的值:
db.collection.find(
<query>,
{ score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } )
有什么想法吗?
谢谢
最佳答案
使用aggregate()
聚合框架中的函数可以利用 text search within the $match
, $sort
和 $group
管道运营商将帮助您实现
想要的结果。
以以下管道为例,它使用 $match
运算符作为初始步骤,包括 $text
操作。分数可以是 $sort
的一部分管道规范和前面的管道,$group
使用 $addToSet
创建按分数排序的不同值 运算符:
socket.on('searchProductName', function (data) {
MongoClient.connect(config.database.url, function (err, db) {
var pipeline = [
{
"$match": {
"$text": {
"$search": data
}
}
},
{ "$sort": { "score": { "$meta": "textScore" } } },
{
"$group": {
"_id": null,
"products": { "$addToSet": "$productName" }
}
}
];
db.collection(config.database.collection.products)
.aggregate(pipeline, function (err, docs) {
socket.emit('searchProductNameResults', docs[0].products);
db.close();
}
);
});
});
关于node.js - MongoDB 和 NodeJS 中的全文搜索,并以不同值进行文本评分排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41652038/