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