【问题标题】:Data model for fields that change frequently in ElasticSearchElasticSearch 中频繁变化的字段的数据模型
【发布时间】:2014-08-21 14:33:19
【问题描述】:

在 ElasticSearch 的文档中处理频繁更改的字段的最佳方法是什么?根据他们的docs about partial updates...

然而,在内部,更新 API 只管理我们已经描述的相同的检索-更改-重新索引过程。

特别是,考虑到索引字段的数量和必须分析的某些文本字段的大小,文档的索引可能很昂贵时应该怎么做?

作为一个具体示例,使用 SO 的观点和对问题和答案的投票计数。仅仅为了更新这些值而重新索引文本正文似乎很昂贵。

【问题讨论】:

  • 您可以在新文档中输入新投票,然后汇总以获取投票数??
  • @progrrammer 我认为您将不得不为我提供更详细的答案。例如,我如何在查询时将这个新文档加入到现有文档?

标签: elasticsearch


【解决方案1】:

也许您不应该如此频繁地更新。也许像投票/视图这样的东西应该只在 ES 中定期更新,而像答案/问题这样的更关键的字段会立即推送。考虑什么是最重要的,看看你是否可以摆脱某种程度的陈旧。

ElasticSearch 非常适合文本搜索,但我不认为 ES 完全支持 SO(或类似应用程序)。它可能是搜索 SO 上的答案/问题或内部应用程序(如日志/事件分析)的有用工具。但也许使用不同的解决方案可以更好地完成数据的实际服务?也许它应该由 Cassandra 驱动来完成大部分工作?你明白了……

如果您想使用 ES 作为您的需求的解决方案,并且您必须经常更新,您绝对可以考虑已经提到的父/子模型。当然,该方法将需要更多的内存/磁盘空间,并且在查询总计时会占用更多的 cpu/时间。另一种方法是让父存储可搜索字段,并让子保存元数据(不分析子字段的位置)。这将允许您进行频繁的更新,而无需进行昂贵的重新索引,因为没有要索引的内容。

您还可以考虑我上面提到的内容,看看您是否可以摆脱一些陈旧。这也可以通过多种方式完成。您可以按更改类型限制您的请求,或更改刷新/刷新间隔,或者如果您要批量发送更新,请考虑删除重复更新。这些也有缺点...

【讨论】:

    【解决方案2】:

    我认为处理更改的最佳方法是拆分文档(您可以使用父子关系,或者仅具有父 ID),并使文档尽可能小(将可更改部分移动到新类型)。

    这可以是实现您的要求的一种方式,例如,

    您可以为此使用多种类型,请考虑这篇文章(观看次数和投票计数)。

    1. 为发布、查看和投票创建一个类型。
    2. 对于一篇文章,将文档索引到 文章类型(索引文章 ID、标题描述标签),对于该文章的每个视图,您可以将文档索引到 视图类型(带有帖子 ID),如果已投票,您可以使用(投票数、帖子 ID 和您需要的其他信息 [如正面或负面标志])将投票索引到 投票类型
    3. 因此,要获取帖子的视图,请使用帖子 ID 过滤器,并获取视图类型中的文档计数
    4. 要获得票数,请使用 stat aggregation 获得票数,或使用 terms aggregation 后跟 stat aggregation 获得正面和负面投票。

    这是我认为最好的方式,也可以有其他意见。

    谢谢

    【讨论】:

      【解决方案3】:

      我所做的是使用 mongo 或 mysql 之类的数据库来存储经常更新的属性,并使用弹性搜索来存储文档以进行文本搜索。

      示例:我想保留有关一本书及其内容的数据,并且我还想保留查看总数,每次用户查看文档时更新和重新索引文档完全是多余的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-31
        • 2014-09-25
        • 1970-01-01
        • 2020-08-02
        • 2017-12-08
        • 2017-11-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多