假设我有样本数据库结构
[
{ 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
键乘以得分?
答案 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
}