我有一个简单的博客文章网站,不同的作者可以在其中创建文章,该网站由
title
和 content
字段组成。由于遗留实施和其他因素,我使用了mongodb。
在网站中,它有一个搜索栏,用户可以在其中进行自由文本搜索以获取相关文章的列表。在后端,我使用 Mongodb text index 和 $text search 来进行查询。
我如何创建索引(标题更有权重)
db.articles.createIndex(
{ title: "text", content: "text" },
{
weights: {
title: 10,
content: 1
},
name: "ArticleIndex"
}
)
查询示例
db.articles.find(
{ $text: { $search: "coffee bake" } },
{ score: { $meta: "textScore" } }
).sort(
{ score: { $meta: "textScore", _id: -1 } }
)
在查询中,我添加了一个额外的
_id: -1
,这样如果出现平局,最新创建的文章将被放在第一位。
现在的问题是,一些作者试图通过在
content
中多次放置某些关键词来操纵排序,以至于看起来相当明显。例如,我的大多数用户会搜索城市名称New York
。因此,某个特定作者会在整个 New York
中发送垃圾邮件短语 content
。因此,他的文章在 Mongodb $text 搜索中获得了很高的文本分数,并且始终出现在顶部。
Mongodb $text 搜索中有没有办法忽略多次出现的搜索关键字?另外,有没有办法以某种方式包含
_id
字段来贡献排序分数,即最新的项目将具有更高的分数?
您无法直接使用
$meta
排序。所以你可以$addFields
添加分数并按分数和id排序。示例:
[{
$match: {
$text: {
$search: 'coffee bake'
}
}
}, {
$addFields: {
scoreSearch: {
$meta: 'textScore'
}
}
}, {
$sort: {
scoreSearch: -1,
id: -1
}
}]