Nano Hash - криптовалюты, майнинг, программирование

Отношение родитель-потомок с сортировкой даты запроса Elasticsearch (повторяющиеся события)

В настоящее время я работаю над приложением, в котором мы обрабатываем события. Итак, в Elasticsearch у нас есть документ с именем Event.

Раньше у нас был только один вид события (уникальное событие, происходящее 13 мая с 9:00 до 11:00), сортировка была простой (сортировка по дате начала с порядком)

Недавно мы добавили новую функцию, которая позволяет нам создавать повторяющиеся события, это означает, что теперь у нас есть 2 уровня внутри Elasticsearch (отношение родитель-потомок).

У нас может быть родительское событие от 12 мая с 14:00 до 14 мая с 18:00, связанное с этим событием, например, у нас есть дочерние элементы, которые происходят ежедневно. Таким образом, у нас было бы: 12 мая с 14:00 до 18:00, 13 мая с 14:00 до 18:00, 14 мая с 14:00 до 18:00.

Проблема с фактической сортировкой заключается в том, что когда мы будем 12 мая в 22:00, мы найдем повторяющееся событие в верхней части списка, а после этого будет уникальное событие.

Я хотел бы иметь сортировку, в которой ближайшая дата имеет более высокий приоритет. В этом случае уникальное событие должно было быть первым в списке.

Чтобы это произошло, я проиндексировал дочерние узлы в родительском повторяющемся событии, чтобы иметь дочерние элементы start_date. Идея заключалась бы в том, чтобы получить ближайшую дату из дочернего узла для каждого повторяющегося события и отсортировать ее по start_date каждого уникального события.

У меня нет большого опыта работы с elasticsearch, поэтому я как бы застрял, я видел много информации в документации (родитель-потомок, вложенные объекты, скрипты и т. д.), но я не знаю, как с этим справиться кейс.

Я надеюсь, что я правильно объяснил, если у вас есть какие-либо вопросы, не стесняйтесь задавать их, я был бы рад предоставить вам дополнительную информацию.


Ответы:


1

Для будущих пользователей Google, вот как я это исправил.

Пришлось использовать сценарии и сортировать с ним, вот частичный пример запроса, который я использую

GET /event/_search
{
    "query" : {
      "match_all": {}
    },
    "sort" : {
        "_script" : {
            "type" : "number",
            "script": {
              "lang": "painless",
              "params": {
                "currentDate": 1560230000
              },
              "source": """
                def isRecurrenceParent = params._source.is_recurrence_parent;
                def countChildren = params._source.children.length;
                def currentDate = params.currentDate;

                if (isRecurrenceParent === false) {
                  return params._source.timestamp;
                }

                def nearest = 0;

                def lowestDiff = currentDate;

                for (int i = 0; i < countChildren; i++) {
                  def child = params._source.children[i];

                  def diff = child.timestamp - currentDate;
                  if (diff > 0 && diff < lowestDiff) {
                    lowestDiff = diff;
                    nearest = child.timestamp;
                  }
                }

                return nearest;
"""
            },
            "order" : "asc"
        }
    }
}
21.05.2019

2

Первое, что вы должны учитывать, это то, что родительские и дочерние документы сохраняются отдельно. Это означает, что Parent-Event::1 и Child-Event::1 сохраняются в одном и том же осколке (ES направляет к осколку, где родитель находится по его хэшу идентификатора), но типы документов разные. Таким образом, вы должны получать родительские и дочерние документы отдельно по запросу и сортировать по дате. (Вы можете сделать следующие запросы в php, если работает)

P.S: У меня тоже такая же ситуация, но мне пришлось реализовать на Java. Итак, я сделал построитель запросов ES (https://github.com/mashhur/java-elasticsearch-querybuilder), который также поддерживает запросы отношений родитель-потомок, вы можете найти ссылку.

// search child events and sort by date
GET events/_search {
"query": {
"has_parent": {
  "parent_type": "parent-event",
  "query": {
    "match_all": {}
   }
  },
  "sort": [{"start_date": {"desc"}}]
 }
}


// search parent events and sort by date
GET events/_search {
"query": {
"has_child": {
  "type": "child-event",
  "query": {
    "match_all": {}
   }
  },
  "sort": [{"start_date": {"desc"}}]
 }
}
24.05.2019
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..