在ElasticSearch上批量刷新数据:批量更新/删除与从头开始使用别名

时间:2017-04-03 18:05:03

标签: elasticsearch

我有一个数据源,提供文档的最新快照(而不是差异)。我希望相同的快照能够反映出搜索的elasticsearch。我有以下选项来做同样的事情:

  1. 从弹性(使用滚动)获取所有内容并计算内存中的差异和批量更新(具有索引操作的批量API)相同 - 这将要求程序保持两倍的内存来计算差异
  2. 批量更新(带有索引操作的批量API)快照中的所有内容,并获取未更新为弹性的所有内容(在UID上使用过滤器并最后更新的搜索API),并另外批量请求软删除差异(具有更新操作的批量API) - 略好于1)因为我们不需要从弹性下载大量数据,只需差异
  3. 使用别名保留弹性上的两个索引,一个作为当前"可搜索"复制,另一个作为更新的备用。每当有新的快照进入时,我们都可以使用备用的快照到[delete all documents][1],将快照中的所有内容批量更新到备用中的所有内容并将别名(别名API - 原子性质)翻转为更新的一个以便搜索最新的内容。
  4. 注意:差异应该非常小。

    在弹性的性能成本和空间效率方面,方法2与方法3相比如何?

1 个答案:

答案 0 :(得分:0)

在内存要求和计算需求方面,选项1显然性能最差。您需要1)查询主数据源中的所有记录,2)查询Elasticsearch中的所有记录,3)找出差异和4)再次批量更新Elasticsearch中的所有记录。随着时间的推移,您的主数据源将始终包含大致相同数量的记录,但ES中的记录数量将增加,因为您的快照中的新记录不在Elasticsearch中,并且还需要从中删除记录Elasticsearch,这意味着上面的第2步每次都会检索越来越多的文档。

使用选项2,您需要1)查询主数据源中的所有记录,2)批量索引它们,3)然后查询Elasticsearch以查找未更新的记录,4)再次在Elasticsearch中批量更新它们。由于与选项1相同的原因,这不是我的偏好,即您的Elasticsearch索引将继续增长。

在我看来,选项3是最接近理想解决方案的。我建议每次需要索引快照时,创建新索引,批量索引快照数据,完成后将searchable别名翻转到新索引。您也可以删除旧索引,因为您不再使用它。无需任何差异,批量删除或批量更新任何内容。

  • 第1天:
    • Index1(别名:searchable
  • 第2天:
    • Index1(可删除)
    • Index2(别名:searchable
  • 第3天:
    • Index1(可删除)
    • Index2(可删除)
    • Index3(别名:searchable