我试图从mongo获得更相关的结果,假设我有这个集合
{ "text" : "mitsubishi lancer 2011"}
{ "text" : "mitsubishi lancer 2011"}
{ "text" : "mitsubishi lancer 2011 in good conditions"}
{ "text" : "lancer 2011"}
{ "text" : "mitsubishi lancer 2014"}
{ "text" : "lancer 2016"}
并进行此查询
db.post.find({$text: {$search: "mitsubishi lancer 2011"}}, {score: {$meta: "textScore"}}).sort({score:{$meta:"textScore"}})
我得到了这个结果
{ "text" : "mitsubishi lancer 2011", "score" : 2 }
{ "text" : "mitsubishi lancer 2011", "score" : 2 }
{ "text" : "mitsubishi lancer 2011 in good conditions", "score" : 1.7999999999999998 }
{ "text" : "lancer 2011", "score" : 1.5 }
{ "text" : "mitsubishi lancer 2014", "score" : 1.3333333333333333 }
{ "text" : "lancer 2016", "score" : 0.75 }
我怎么知道前两个有我搜索的所有文本?
分数是谁计算的?
答案 0 :(得分:2)
评分算法是MongoDB的内部算法,应该可能会随着时间的推移而改变,因此准确的值不重要。如果您愿意,可以尝试通过查看sources来了解所发生的事情(虽然我不建议这样做)。
最终得分取决于搜索词的出现次数(或者说词干),匹配之间的距离,匹配质量(完全匹配与部分),语言设置和权重{{{ 3}}。这些都是非常重要的东西,无法轻易记录下来。但是,有一篇博文可以很好地解释一些方面:configure 此外,一旦您使用搜索词和索引数据的不同组合尝试各种查询,事情就会变得更加清晰。
最后,如果你想知道是否有一个完美的匹配,我能想到的唯一方法就是这样:
db.getCollection('test').aggregate(
{
// do the normal filtering query
$match: {
$text: {
$search: "mitsubishi lancer 2011"
}
}
}, {
// select what's relevant in the output and add an indicator "perfectmatch"
$project: {
"text": 1,
"score": {
$meta: "textScore"
},
"perfectmatch": {
$cond: [
{ $eq: [ "$text", "mitsubishi lancer 2011" ] }, // this would check for a perfect match using the exact full string, for individual token matching you would need to do tokenize your query and do a series of other checks here.
true,
false
]
}
}
}, {
// if you want to have the results sorted by "best match first"
$sort: {
"score": -1
}
})