如何在 Mongodb $text 搜索中忽略多次出现的搜索关键字?

问题描述 投票:0回答:1

我有一个简单的博客文章网站,不同的作者可以在其中创建文章,该网站由

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
字段来贡献排序分数,即最新的项目将具有更高的分数?

database mongodb search indexing full-text-search
1个回答
0
投票

您无法直接使用

$meta
排序。所以你可以
$addFields
添加分数并按分数和id排序。示例:

[{
 $match: {
  $text: {
   $search: 'coffee bake'
  }
 }
}, {
 $addFields: {
  scoreSearch: {
   $meta: 'textScore'
  }
 }
}, {
 $sort: {
  scoreSearch: -1,
  id: -1
 }
}]
© www.soinside.com 2019 - 2024. All rights reserved.