elasticsearch &引用;扇出;指数化策略,elasticsearch,elasticsearch" /> elasticsearch &引用;扇出;指数化策略,elasticsearch,elasticsearch" />

elasticsearch &引用;扇出;指数化策略

elasticsearch &引用;扇出;指数化策略,elasticsearch,elasticsearch,我计划使用Elasticsearch作为一种社交网络平台,用户可以发布“更新”,与其他用户成为朋友,并关注他们朋友的反馈。最基本也是最常见的查询是“获取我关注的朋友与我共享的帖子”。此查询可以通过附加约束(如标记或地理搜索)进行扩展 我了解到,社交网络通常采用发散式的写作方式,向关注者传播“更新”,从而使查询更加本地化。因此,我可以看到两种潜在的索引策略: 将所有帖子存储在一个索引中,并搜索帖子(1)与请求者共享,以及(2)其作者在请求者跟随的用户列表中(“天真”方法) 为每个用户创建一个索引,

我计划使用Elasticsearch作为一种社交网络平台,用户可以发布“更新”,与其他用户成为朋友,并关注他们朋友的反馈。最基本也是最常见的查询是“获取我关注的朋友与我共享的帖子”。此查询可以通过附加约束(如标记或地理搜索)进行扩展

我了解到,社交网络通常采用发散式的写作方式,向关注者传播“更新”,从而使查询更加本地化。因此,我可以看到两种潜在的索引策略:

  • 将所有帖子存储在一个索引中,并搜索帖子(1)与请求者共享,以及(2)其作者在请求者跟随的用户列表中(“天真”方法)
  • 为每个用户创建一个索引,插入跟踪用户创建的帖子,并直接在该索引中搜索(“扇出”方法)
  • 从搜索的角度来看,第二个选项显然要有效得多,尽管它带来了同步方面的挑战(例如,当我停止跟踪朋友时需要删除帖子)。但我最关心的是指数的乘法;在一个(成功的)社交网络中,我们可以预期至少有成千上万的用户

    所以我的问题是:

    • ES如何应对大量指数?它会引起性能问题吗
    • 对于我的特定用例,有没有关于更好的索引策略的想法
    谢谢

    每个elasticsearch索引碎片都是一个单独的Lucene索引,这意味着几个打开的文件描述符和内存开销。通常,即使在将每个索引的碎片数从默认值5减少后,每个用户索引场景中的资源消耗也可能过大

    很难给出具体的数字,但我的猜测是,如果您坚持每个索引使用两个碎片,那么每台m3.medium机器最多只能处理3000个用户,这在我看来是禁止的

    但是,您不一定需要为每个用户都提供专用索引。可以使用过滤的别名为多个用户使用一个索引。从应用程序的角度来看,它看起来像一个按用户的场景,而不会产生上面提到的开销。请参阅此以了解详细信息

    尽管如此,我并不认为elasticsearch特别适合于扇出式写策略。然而,这是一个非常好的解决方案,可以在扇出读取场景中使用(类似于您所概述的(1)):

    • 使用elasticsearch的最大优势在于,您能够执行相关性评分,通常基于一些时态特征,如浏览上下文。使用elasticsearch仅检索按时间戳排序的文档意味着您没有利用它的潜力。同时,像Redis这样的解决方案将为您提供更优越的阅读性能

    • 扇出写入场景意味着每次更新都要进行大量写入(特别是,如果您的用户有很多追随者)。Elasticsearch不是数据库,也没有针对这种使用模式进行优化。然而,它为频繁阅读做好了准备

    • 在写文章时分散也意味着你通过复制帖子的信息来产生大量的“额外”数据。为了将这些数据保存在RAM中,您只需要存储元数据,如单独的文档存储中的文档id和标记。同样,除了JSON之外,还有其他格式可以有效地存储和搜索此类结构化数据


    在这两种情况中进行选择是一个关于您的需求的问题,如平均追随者数量、几乎所有人都遵循的“中心”数量、提要是否自然订购(例如按时间)等。我认为,决定是否使用elasticsearch需要作为此分析的结果。

    感谢您给出的完整答案!因此,ES节点在面临内存压力或缺少文件描述符时不会卸载/关闭LRU索引?据我所知不是这样。我认为您需要自己关闭它们(这将释放RAM和文件描述符)。