【问题标题】:Searching from multiple lists with elasticsearch使用 elasticsearch 从多个列表中搜索
【发布时间】:2014-01-04 08:53:32
【问题描述】:

我们有以下设置(简化/更改):

MongoDB 集合: 文章

Redis 列表: 今天 昨天 本星期 本月

我们经常收到新文章并将它们放入适当的列表中(新文章进入“今天”、“本周”和“本月”[redis 列表包含 mongodb 集合的 id])。

这些列表可以包含很多项目(“本月”达到数百万)。 这些列表经常变化,文章消失又重新出现(业务逻辑)。

这些列表必须是可搜索的(+beyonce -rihanna,如果您想阅读有关碧昂丝而不是蕾哈娜的新闻)。我们的第一个实现(当列表很小时)是在 Elastic 中简单地索引整个文章集合,当搜索特定列表时,我们使用关键字 (+beyonce -rihanna) 和列表中包含的所有 id 查询 elastic。这适用于几千个条目,但正如预期的那样,它不能很好地扩展。

我们目前想到了两种方法来处理这个问题:

  • 在索引新文章(弹性)时,我们会引用所有列表 它在里面。所以当查询特定列表中的文章时,我们的查询 包含关键字 (+beyonce -rihanna) 和我们正在查询的列表 从昨天)。
  • 在 Elastic 中创建多个索引(每个 redis 列表 1 个)。当查询一篇文章时,我们只需指定索引和关键字。

这两种方法都对吗?还是我们应该以不同的方式处理这种情况?

【问题讨论】:

    标签: database database-design elasticsearch


    【解决方案1】:

    无论哪种方式都是一个很好的解决方案,IMO。您需要选择最适合您的业务需求并且可以为您的组织维护的一种。考虑到选择,我更喜欢在单个索引中引用与文章相关联的列表的第一个选项,原因如下:

    • 当文章在列表之间移动时(今天、昨天、本周、本月),您只需更新列表引用。使用第二种方法,您需要管理删除文章并将其添加到适当的索引。
    • 如果有一个用例需要同时搜索多个列表(例如今天和昨天),那么如果文章位于不同的索引中,您将失去排名、排序和聚合功能。您需要对单独的索引执行单独的搜索,然后自己对结果进行排名、排序和汇总。

    如果您决定使用单个索引的第一个选项,我建议使用过滤的Index Aliases 来管理针对不同列表的查询。使用这种方法,您可以创建一个索引,然后使用别名命名为今天、昨天、this_week 和 this_month,它们将根据该列表名称自动过滤文章。当您需要过滤多个列表时,您始终可以搜索主索引本身。

    【讨论】:

      猜你喜欢
      • 2013-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-09
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      • 2023-01-24
      相关资源
      最近更新 更多