ElasticSearch upsert документ со сложным сценарием - PullRequest
0 голосов
/ 10 апреля 2019

Я создаю индекс для хранения продолжительности того, как долго люди смотрят определенное видео, структура индекса выглядит следующим образом:

{
    "first_watch_time": "2019-04-01T02:17:14.004Z",
    "last_watch_time": "2019-04-01T02:18:24.004Z",
    "duration": 70
}

, когда я создаю документ, я использую user_id в качестве документа _id.Например, когда Боб (user_id равен 1) сначала смотрит видео, инициирует событие, в индексе нет документа, и поэтому я создаю его для него:

PUT video_duration/video_duration/1
{
    "first_watch_time": event_time,
    "duration": 0
}

, поле «first_watch_time» - это когдасобытие произошло.Через некоторое время, когда Боб нажимает кнопку паузы, запускает новое событие, теперь я хочу использовать синтаксис upsert для обновления продолжительности:

POST video_duration/video_duration/1/_update
{
  "script": {
    "source": "ctx._source.duration += params.duration; ctx._source.last_watch_time = event_time",
    "lang": "painless",
    "params": {
      "duration": "duration(event_time - ctx._source['first_watch_time'])"
    }
  },
  "upsert": {
    "duration": 0,
    "first_watch_time": event_time
  }
}

Теперь вопрос в том, что я не знаю, как писать параметры,и я нахожу, что значение ключа в параметрах выглядит как конкретное значение или строка, а также я не знаю, как вычесть две метки времени в скрипте.Возможно ли использовать upsert для вычисления продолжительности, или мне нужно сначала запросить документ и вычислить продолжительность в памяти, а затем использовать еще один запрос для его обновления?

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