【问题标题】:Elasticsearch: Working with frequently updated documentsElasticsearch:处理频繁更新的文档
【发布时间】:2015-03-24 07:14:13
【问题描述】:

我有一个论坛应用程序。论坛中有多个主题(帖子)。每个主题都有viewCount(论坛用户查看该主题的次数)等字段。

我希望主题的所有字段都取自 ES(id、日期、标题、内容和 viewCount)。但是,在这种情况下,在每个主题视图之后,ES 必须再次重新索引整个文档。
我问了关于堆栈溢出时部分更新的问题 - Partial update on field that is not indexed。需要注意的是,viewCount 字段没有被索引,它只是存储在 ES 中。

有两个术语 - 部分更新和部分索引。 ES 中有部分更新,您只能更改几个字段。但是没有部分重新索引,这意味着即使您只更改一个字段,ES 也会重新索引整个文档。这意味着如果该主题被查看 1000 次,ES 将索引它 1000 次。如果我有很多用户,很多文档会一次又一次地被索引。这是第一个策略。

第二种策略是将主题的一些字段保留在索引中,而将一些字段保留在数据库中。在这种情况下,我可以从 DB 中获取 viewAcount。此外,我可以将所有字段存储在数据库中,并将索引仅用作 INDEX,即获取当前主题的 id。

解决此类问题的最佳方法是什么?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    对我来说,似乎在使用 ES 的情况下,您应该只更新索引中的所有数据并对其进行查询。如果您要拆分文本(据我所知,您将主题存储在 ES 中以进行文本搜索)和数据存储之间的“数字”数据,与在 ES 中重新索引文档的情况相比,您将体验到更大的性能损失。

    ES 唯一可以对索引中的文档做的事情——索引和删除。所以,有两种方法可以加快重新索引的速度

    • 加速“有效负载” - 减少删除文档和 再次索引它。这可以通过移动ES index to memory 来实现,以利用LuceneRamIndexStore

    • 减少网络开销 - 在 ES 端使用scripts执行操作

    顺便说一句,您是否已经遇到性能问题?

    【讨论】:

      【解决方案2】:

      关于文档的部分更新,重要的是要认识到,虽然 API 允许您执行部分更新,但在幕后,它通过检索文档、更改文档和重新索引来执行完整更新。以下来自 Elasticsearch 网站:

      Partial Updates to Documents

      在更新整个文档中,我们说过更新文档的方法是检索它,更改它,然后重新索引整个文档。这是真实的。但是,使用更新 API,我们可以进行部分更新,例如在单个请求中增加一个计数器。

      我们还说文档是不可变的:它们不能更改,只能替换。更新 API 必须遵守相同的规则。从外部看,似乎我们正在对文档进行部分更新。然而,在内部,更新 API 只管理我们已经描述过的相同的检索-更改-重新索引过程。不同之处在于这个过程发生在一个分片内,从而避免了多个请求的网络开销。通过减少检索和重新索引步骤之间的时间,我们还降低了其他进程发生冲突更改的可能性。

      要在 Elasticsearch 中存储全文数据,并在不重新索引整个文档的情况下经常更改字段,您需要将这些项目存储在其他位置。这可以是另一个 Elasticsearch 索引或另一个系统中的元数据/计数器存储。

      对于常见用例,您可以对两者运行相同的查询并合并结果。这些很可能是对不变的字段进行简单过滤和排序,例如主题、创作时间、作者等

      对于不匹配的搜索,例如全文查询,您可以 (a) 不显示该数据,或 (b) 使用最终一致的方法,使用更新后的计数定期更新 Elasticsearch 主题存储.许多对一致性要求不高的系统可以使用最终一致性方法,包括 Stack Overflow、Netflix 等。例如,在某些网站上,您会在一个页面/小部件上获得一个计数,而在另一个页面/小部件上获得另一个计数/小部件由于最终一致的设计。

      【讨论】:

        【解决方案3】:

        我想最好的方法是重新考虑您的索引设计。创建另一个索引可能有意义,该索引具有较少的字段数,因此索引/更新成本较低,它将 id 映射到它们各自的视图计数。然后,您的客户端可以发出两个查询来获取所有必需的信息。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-08-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-19
          • 2019-10-13
          相关资源
          最近更新 更多