我有以下全文搜索查询示例:
db.collection.find({ $text: { $search: "dog cat" } })
这将返回包含dog OR cat
的文档,但我想按相关性对结果进行排序:
当然,我正在寻找可以使用3个或更多搜索词的解决方案。
我发现有一个aggreagation pipeline in MongoDB,也许已经太晚了,我的大脑已经被炒了,但是在这种情况下无法弄清楚我是如何使用它的。
--- Node.js和MongoJS中的解决方案---
只需将所有内容保存在一个地方以供将来参考,Tug Grall的解决方案在Node.js / MongoJS中实现:
.get(function(req, res) {
db.docs.find({ $text: { $search: req.query.q } }, {score : { $meta: "textScore" } })
.sort( { score: { $meta: "textScore" } }, function(err, results) {
if (err) {
res.send(err);
} else {
res.json(results);
}
} );
});
答案 0 :(得分:11)
在MongoDB 2.6.x中,您可以直接在查询中使用$ meta textScore:
db.docs.find( { $text : {$search : "dog cat"} } ,
{score : { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } )
结果按相关性排序:
db.docs.find( { $text : {$search : "dogs cat"} } ,
{score : { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } )
{ "_id" : "3", "text" : "I like dogs and cats", "score" : 1.3333333333333333 }
{ "_id" : "4", "text" : "I like dogs. But I do not like cats", "score" : 1.25 }
{ "_id" : "1", "text" : "I like dogs", "score" : 0.75 }
{ "_id" : "2", "text" : "I like cats", "score" : 0.75 }