如何在mongodb全文搜索中计算textScore字段?

hem*_*hav 10 full-text-search mongodb

我想知道MongoDB如何计算全文搜索中文本的分数.就像我会搜索samsung note edge以下内容:

Samsung Galaxy Note Edge
Samsung Galaxy Note 4
Samsung Galaxy S6 Edge
Samsung Galaxy Note 4 duos
Samsung Z
Run Code Online (Sandbox Code Playgroud)

全文搜索如下:

db.mobiles.find({
    $text : {$search : "samsung note edge"}
}, {
    score : {$meta : "textScore" }
}).sort({
    score : {$meta : "textScore" }
})
Run Code Online (Sandbox Code Playgroud)

给我的结果如下:

{
    name : "Samsung Galaxy Note Edge",
    score: 1.875000
},
{
    name : "Samsung Galaxy Note 4",
    score: 1.250000
},
{
    name : "Samsung Galaxy S6 Edge",
    score: 1.250000
},
{
    name : "Samsung Galaxy Note 4 duos",
    score: 1.200000
},
{
    name : "Samsung Z",
    score: 0.750000
}
Run Code Online (Sandbox Code Playgroud)

如果我要搜索,结果会有所不同 Samsung edge

sat*_*ati 2

  • 从...开始exp = 0;
  • 每次出现该术语时: if exp = 0, set exp = 1, else set exp = 2 * exp;
  • 将频率增加1/exp

所以,事实上,你是对的,这里有一个几何级数的和。如果某个术语出现 k 次,则该术语的频率(更像是分数而不是频率,但在结构体中称为 freq)将是 1 + 1/2 + ... + (1/2)^(k - 1) = (1 - (1/2)^k)/(1 - 1/2) = 2 * (1 - 1/2^k)