MongoDB和NodeJS中的全文搜索,文本分数排序为不同的值

时间:2017-01-14 16:03:50

标签: node.js mongodb full-text-search distinct

我尝试使用mongodb 3.4,nodejs和socket.io实现全文搜索,并使用distinct和sort。到目前为止这么好,我有这个代码工作正常,但没有排序部分:

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" } } )

有什么想法吗?

谢谢

1 个答案:

答案 0 :(得分:1)

使用汇总框架中的 aggregate() 功能,充分利用text search within the $match $sort { {3}} 管道运营商将帮助您实现目标 期望的结果。

例如,以下管道使用 $group 运算符作为初始步骤,并包含 $match 操作。分数可以是 $text 管道规范的一部分,前面的管道 $sort 会创建按分数排序的不同值,使用< strong> $group 运营商:

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();
            }
        );

    });
});