Эффективное агрегирование в поле скрипта (объект с множеством атрибутов) в ElasticSearch - PullRequest
1 голос
/ 09 апреля 2019

У меня есть двухуровневая структура данных, по которой я пытаюсь найти статистику.Давайте представим, что данные посты и комментарии.Это выглядело бы примерно так:

[
  {"title": "Post 1", "comments": [
    {"name": "Comment 1", "date": "2019-01-10", "character_count": 1000},
    {"name": "Comment 2", "date": "2019-01-11", "character_count": 2000},
    {"name": "Comment 3", "date": "2019-01-12", "character_count": 1500},
    {"name": "Comment 4", "date": "2019-01-13", "character_count": 2500},
    {"name": "Comment 5", "date": "2019-01-15", "character_count": 3000}
  ]},
  {"title": "Post 2", "comments": [
    {"name": "Comment 1", "date": "2019-01-10", "character_count": 400},
    {"name": "Comment 2", "date": "2019-01-13", "character_count": 500},
    {"name": "Comment 3", "date": "2019-01-15", "character_count": 4000},
  ]}
]

Несколько примечаний к данным:

  • Каждый «комментарий» имеет гораздо больше атрибутов, чем просто character_count (вероятно, 30).
  • Существует не очень много «комментариев» на «пост», редко более 200 и обычно менее 30.
  • Есть тысячи «постов».
  • ВОтображение, «комментарии» являются вложенным объектом.

При выполнении запроса меня интересует только один «комментарий» на «сообщение», основанный на дате.На определенную дату мне нужен последний комментарий, предшествующий этой дате.Я могу получить эти данные, используя скриптовое поле:

{
  "script_fields": {
    "relevant_comment": {
      "script": "sorted = _source.comments.findAll { it.date < report_date } . sort { a, b -> b.date <=> a.date }; return sorted ? sorted.first() : null;",
      "params": {
        "report_date": "2019-01-12"
      }
    }
  }
}

Так что для «2019-01-12» я получу {"name": "Comment 2", "date": "2019-01-11", "character_count": 2000} для «Поста 1» и {"name": "Comment 1", "date": "2019-01-10", "character_count": 400} для «Поста»2 ".

Теперь мне нужно агрегировать, но как мне это сделать?Например, мне нужно получить среднее количество символов.Или, может быть, число «постов», у которых число символов меньше определенного значения?

Здесь есть ответ , где предлагается поместить скрипт в саму агрегацию.Хотя это работает, кажется ужасной тратой сортировать и фильтровать список каждый раз, когда мне нужно получить один атрибут.

Или, может быть, мне даже не нужны поля со сценариями, и есть другое решение?

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