MongoDB全文搜索和按相关性排序的多个单词

ors*_*zky 8 mongodb node.js

我有以下全文搜索查询示例:

db.collection.find({ $text: { $search: "dog cat" } })
Run Code Online (Sandbox Code Playgroud)

这将返回包含的文档dog OR cat,但我想按相关性对结果进行排序:

  • 应首先列出包含所有搜索词的结果,
  • 然后是只包含一个搜索词的那些.

当然,我正在寻找一个可以与3个或更多搜索词一起使用的解决方案.

我发现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);
        }
    } );
});
Run Code Online (Sandbox Code Playgroud)

Tug*_*all 11

在MongoDB 2.6.x中,您可以直接在查询中使用$ meta textScore:

db.docs.find( { $text : {$search : "dog cat"}  } , 
              {score : { $meta: "textScore" } }   
             ).sort( { score: { $meta: "textScore" } } )
Run Code Online (Sandbox Code Playgroud)

结果按相关性排序:

 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 }
Run Code Online (Sandbox Code Playgroud)