首页 > 解决方案 > Elasticsearch - 在脚本中组合更新?

问题描述

我对 Elasticsearch 集群中的文档进行了多种类型的更新。他们中的大多数(按数量)是 upserts。但是script更新变得越来越普遍,因为在很多情况下我需要增加一个值或将一个项目推送到现有数组。这意味着单个操作可能会创建多个更新、更新插入和脚本的混合,这些更新在批量更新中应用。

我们对现有文档有大量更新(每天数亿次),所以我开始担心进行大量小更新而不是大更新的开销。我还担心脚本更新不如 upserts 最佳。

但即使我担心脚本更新本身的性能,将这些需要脚本的更新组合脚本本身是否有意义?

例如。用户可能会访问一个页面,我想更新他们的 last_seen 日期以及他们的导航器和语言。我还想增加我见过这个用户的次数。为此,我将使用 2 个更新-

# Update 1
{
  "_op_type": "update",
  "doc": {
    "last_seen": "2020-05-05 15:37:18",
    "navigator": "chrome",
    "lang": "en-us"
  }

}

# Update 2
{
  "script": {
    "lang": "painless",
    "source": """
       ctx._source.total_visits += 1;
    """
  }
}

在脚本更新中完成这一切会更有效(对于弹性搜索)吗?

{
  "script": {
    "lang": "painless",
    "source": """
       ctx._source.last_seen = new Date();
       ctx._source.navigator = params.navigator;
       ctx._source.lang = params.lang;
       ctx._source.total_visits += 1;
    """,
    "params": {
      "navigator": "chrome",
      "lang": "en-US"
    }
  }
}

我的假设是脚本在将内存应用到索引/ssd 之前应用了内存中的所有更改。如果这个假设是正确的,那么我的想法是,如果无论如何我都必须通过脚本应用更新,我还不如将它们结合起来?或者,因为我正在使用批量更新和/或存在写入队列,如果它们都在相对相同的时间应用,我有这么多小更新是否重要?

标签: elasticsearch

解决方案


推荐阅读