当直接与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。
答案 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