Elasticsearch - объединить обновления в сценарии? - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть много типов обновлений, которые я делаю к документам в моем кластере Elasticsearch. Большинство из них (по объему) являются upserts. Но script обновления становятся все более распространенными, поскольку во многих ситуациях мне нужно увеличивать значение или выводить sh элемент в существующий массив. Это означает, что одно действие может создать несколько обновлений, набор upserts и сценариев, которые применяются в массовом обновлении.

У нас большой объем обновлений (сотни миллионов в день) для существующих документов, поэтому Я становлюсь обеспокоенным из-за накладных расходов, связанных с созданием большого количества небольших обновлений, а не больших загрузок. Я также обеспокоен тем, что обновления сценариев не так оптимальны, как 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;
    """
  }
}

Было бы более эффективно (дляasticsearch) сделать все это в обновлении скрипта?

{
  "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"
    }
  }
}

Я предполагаю, что скрипт применяет все изменения в памяти перед применением к indexes / ssd. Если это предположение верно, то я думаю, что если мне все равно придется применить обновление с помощью сценария, я мог бы также объединить их? Или, поскольку я использую массовое обновление и / или существует очередь записи, имеет ли значение даже то, что у меня так много небольших обновлений, если они все применяются одновременно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...