вопрос GitHub

нение варианта использования

У нас есть реляционная база данных с данными о нашей повседневной деятельности. Цель состоит в том, чтобы пользователи могли осуществлять поиск важных данных с помощью полнотекстовой поисковой системы. Данные нормализованы и, следовательно, не в лучшей форме для выполнения полнотекстовых запросов, поэтому идея состояла в том, чтобы денормализовать подмножество данных и скопировать их в режиме реального времени в Elasticsearch, что позволяет нам создавать быстрое и точное приложение для поиска. ,

У нас уже есть система, которая позволяетСобытие Sourcing наших операций с базой данных (вставки, обновления, удаления). События содержат только измененные столбцы и первичные ключи (при обновлении мы не получаем всю строку). Logstash уже получает уведомление для каждого события, поэтому эта часть уже обработана.

Актуальная проблема

Теперь мы подходим к нашей проблеме. Поскольку план состоит в денормализации наших данных, мы должны убедиться, что обновления родительских объектов распространяются на денормализованные дочерние объекты в Elasticsearch. Как мы можем настроить logstash для этого?

пример

Допустим, мы поддерживаем списокEmployees в Elasticsearch. каждыйEmployee назначен наCompany, Поскольку данные денормализованы (с целью более быстрого поиска), каждыйEmployee также носит название и адресCompany, Обновление изменяет имяCompany - Как мы можем настроить logstash для обновления названия компании во всехEmployees, назначенныйCompany?

Дополнительное объяснение

@Darth_Vader: Проблема, с которой мы сталкиваемся, заключается в том, что мы получаем событие, котороеCompany изменилось, но мы хотим изменить документы типаEmployee в Elasticsearch, потому что они несут данные о компании в себе. Ваш ответ ожидает, что мы получим событие для каждогоEmployee, что не так.

Может быть, это прояснит ситуацию. У нас есть 3 сотрудника в Elasticsearch:

{type:'employee',id:'1',name:'Person 1',company.cmp_id:'1',company.name:'Company A'}
{type:'employee',id:'2',name:'Person 2',company.cmp_id:'1',company.name:'Company A'}
{type:'employee',id:'3',name:'Person 3',company.cmp_id:'2',company.name:'Company B'}

Затем происходит обновление в исходной БД.

UPDATE company SET name = 'Company NEW' WHERE cmp_id = 1;

Мы получаем событие в logstash, где оно говорит что-то вроде этого:

{type:'company',cmp_id:'1',old.name:'Company A',new.name:'Company NEW'}

Затем это следует распространить на Elasticsearch, чтобы следующие работники:

{type:'employee',id:'1',name:'Person 1',company.cmp_id:'1',company.name:'Company NEW'}
{type:'employee',id:'2',name:'Person 2',company.cmp_id:'1',company.name:'Company NEW'}
{type:'employee',id:'3',name:'Person 3',company.cmp_id:'2',company.name:'Company B'}

Обратите внимание, что полеcompany.name изменилось.

Ответы на вопрос(1)

Ваш ответ на вопрос