MongoDB文本索引通配符权重

时间:2016-09-20 10:55:10

标签: mongodb

假设我有样本数据库结构

[
  { name: 'hello world', description: { key: 'something' } },
  { name: 'user', description: { key: 'hello world' } },
]

索引

db.fulltext.createIndex({ name: 'text', '$**': 'text' }, { weights: { name: 10, '$**': 5 } })

我正在查询带有查询的文件

db.fulltext.find({ $text: { $search: 'hello world' } }, { score: { $meta: 'textScore' } })

但是......它给我两个文件的得分为15.0 ......不可能给通配符操作符增加权重?为什么第二个文档会从name键乘以得分?

1 个答案:

答案 0 :(得分:2)

通配符索引"$**"包含文本索引中文档中的所有字符串字段。在上面的场景中,name是一个字符串属性,其权重为10,并且通常所有字符串字段权重都指定为5(包括名称字段,因为使用了通配符)。所以,重量被覆盖了。

完成文本搜索后,将为所有String字段指定相同的权重。因此,两个文档的分数相同,因为与其他索引字段没有相对重要性(即因为在创建索引时使用了外卡)。

  

$ text运算符为包含的每个文档分配一个分数   索引字段中的搜索词。分数代表相关性   给定文本搜索查询的文档。

当不同字段需要不同的权重时,您需要在创建索引时专门提供字段名称。换句话说,您不应为String字段提供权重,并且包括所有字符串字段的通配符权重。显然,一个体重会超越另一个体重。

如果你可以改变下面提到的索引,你可以看到差异。

创建索引: -

db.fulltext.createIndex({ name: 'text', 'description.key' : 'text' }, { weights: { name: 10, 'description.key' : 5 } })

搜索: -

db.fulltext.find({ $text: { $search: 'hello world' } }, { score: { $meta: 'textScore' } })

<强>结果: -

{
    "_id" : ObjectId("57e119cbf522cc85b5595797"),
    "name" : "hello world",
    "description" : {
        "key" : "something"
    },
    "score" : 15
}

{
    "_id" : ObjectId("57e119cbf522cc85b5595798"),
    "name" : "user",
    "description" : {
        "key" : "hello world"
    },
    "score" : 7.5
}