如何在$ meta上对$ text搜索进行排序:" textScore"与Loopback?

时间:2016-11-11 22:56:48

标签: mongodb loopback

当直接与MongoDB的api进行交互时,您可以进行全文搜索,并对结果的分数进行排序,如下所示:

 db.someCollection
     .find({ $text: { $search: "some search phrase" } }, 
           {score: { "$meta":"textScore" })
     .sort({ score: { $meta:"textScore"} })

如何将其转换为Loopback过滤器?

我试过这个,但失败了:

 {
      "where":{ 
           "$text" : { "search":"some search phrase" } 
      },
      "fields": {
           "score":{
                "$meta":"textScore"
           }
      },
      "orderby":"score ASC"
 }

不幸的是,这导致:

 [
   {},
   {},
   {}
 ]

当我查看MongoDB配置文件输出时,我发现Loopback已生成此查询:

   "filter" : {
        "$text" : {
            "$search" : "some search phrase"
        }
    },
    "sort" : {
        "score" : 1
    },
    "projection" : {
        "score" : 1
    }

所以它的目标是"得分"好像它是一个普通的字段而不是$ meta字段......而且它排除了所有其他字段。

如何执行环回以生成执行时应如下所示的正确查询:

    "filter" : {
        "$text" : {
            "$search" : "some search phrase"
        }
    },
    "sort" : {
        "score" : {
            "$meta" : "textScore"
        }
    },
    "projection" : {
        "score" : {
            "$meta" : "textScore"
        }
    }

THX。

2 个答案:

答案 0 :(得分:0)

我设法通过使用聚合而不是使用find方法在Loopback中使用它。

const db = Vehicletest.getDataSource().connector;
const collection = db.collection(Vehicletest.modelName);
var cursor = collection.aggregate([{ $match: { $text: { $search: searchText } } }, { $sort: { score: { $meta: "textScore" } } }, { $project: { name: 1 } }], {cursor: { batchSize: 1 }});
cursor.toArray(function(err, docs){
  console.log(docs);
});

如果你看一下mongo文档中的textSearch。有一个名为" text-search-in-aggregation"其中有更多细节。希望这有帮助!

答案 1 :(得分:0)

这里的关键是直接使用mongodb的驱动程序,因为内置过滤器似乎不支持textScore。因此,以@ edison-vs-tesla为例,它应该像这样:

//first get the driver through datasource's connector
const db = Vehicletest.getDataSource().connector;
const collection = db.collection(Vehicletest.modelName);
collection.find(
  { $text: { $search: text } },
  { projection: { fieldName: true, score: { $meta: 'textScore' } } }
)
.sort({ score: { $meta: 'textScore' } })
.toArray(function(err, items) {
  console.log(items); //results
});

可在以下位置找到回送4的完整示例:https://gist.github.com/jgutix/71cbb8a9f5946ecd57328862154e3c15