【问题标题】:How to use full text search and sort them in mongodb如何使用全文搜索并在 mongodb 中对其进行排序
【发布时间】:2020-02-28 21:16:47
【问题描述】:

我使用 mongodb 和 mongoose 从 nodejs 连接。 我的关键词集:

keywords
{
  _id: { type: Schema.Types.ObjectId  },
  word: { type: String, index: true },
  rank: {type: Number}, // Rank is count of voting from users.
  source: {type: String},
  link: {type: Schema.Types.ObjectId, ref: 'Content'} // Link to contents collection
}

和内容合集

{
  _id: { type: Schema.Types.ObjectId  },
  title: { type: String },
  content: { type: String }
}

我的想法:

  1. 第一步:使用全文搜索查找匹配的关键词,排序 最接近的匹配,排名(按最接近的匹配分组)
  2. 第二步:获取链接(关键字的链接属性)查找内容$in 链接。

但在第 1 步排序时并不完全正确。

我的代码:

// Get keywords
let indexes = await Keyword.aggregate([
  { $match: {
  $text: { $search: 'request query' }
}},
  { $limit: 100 },
  { $sort: { rank: -1, createdAt: -1 } }, // I want to sort by highest rank
  { $group: { _id: '$link' } },
  { $project: { link: 1 } }
]);

return await Content.find({
  _id: {
    $in: indexes.map((item) => {
      return item._id;
    })
  }
});

任何可以帮助我的想法。非常感谢!

【问题讨论】:

    标签: mongodb mongoose


    【解决方案1】:

    为什么不使用单个集合?设置与索引相同的字段。对索引关键字的查询只会查看索引以选择文档 - 它不会将文档作为搜索的一部分打开。索引单独存在于文档之外。

    看起来您出于索引搜索的原因将拆分为 2 个集合,但 Mongodb 正在内部为您执行此操作,方法是在索引中指定一个字段.....

    【讨论】:

    • 因为关键字将由用户添加。当用户在搜索框中输入文本时,我的应用程序会询问用户,这个结果是否与您的问题正确?,当用户单击“是”然后检查关键字集合中是否存在此关键字然后增加排名,否则它将被保存到关键字集合排名为 1
    【解决方案2】:

    关键字设计,并为该字段编制索引,是一个非常好的主意,并且会非常有效。无需将此字段放在单独的文档中,索引会处理此问题....在他们输入时将关键字字段放入​​其数据的文档中,并尽可能将它们放在一起。

    【讨论】:

    • 是的,我知道,但是由于某些原因,我将来必须使用更开放的关键字
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多