Объяснение варианта использования
У нас есть реляционная база данных с данными о наших повседневных операциях. Цель состоит в том, чтобы позволить пользователям искать важные данные с помощью полнотекстовой поисковой системы. Данные нормализованы и, таким образом, находятся не в лучшей форме для выполнения полнотекстовых запросов, поэтому идея заключалась в денормализации подмножества данных и их копировании в режиме реального времени в Elasticsearch, что позволяет нам создавать быстрое и точное поисковое приложение. .
У нас уже есть система, которая позволяет Event Sourcing для наших операций с базой данных (вставки, обновления, удаления ). События содержат только измененные столбцы и первичные ключи (при обновлении мы не получаем всю строку). Logstash уже получает уведомление о каждом событии, поэтому эта часть уже обработана.
Актуальная проблема
Теперь мы подошли к нашей проблеме. Поскольку мы планируем денормализовать наши данные, мы должны убедиться, что обновления родительских объектов распространяются на денормализованные дочерние объекты в Elasticsearch. Как мы можем настроить logstash для этого?
Пример
Допустим, мы ведем список Employees
в Elasticsearch. Каждому Employee
присваивается Company
. Поскольку данные денормализованы (для ускорения поиска), каждый Employee
также несет имя и адрес Company
. Обновление изменяет имя Company
- как мы можем настроить logstash для обновления названия компании во всех Employees
, назначенных Company
?
Дополнительное объяснение
@Darth_Vader: Проблема, с которой мы сталкиваемся, заключается в том, что мы получаем событие, что Company
изменился, но мы хотим изменить документы типа Employee
в Elasticsearch, потому что они несут данные о компании сами по себе. В вашем ответе ожидается, что мы будем получать событие для каждого Employee
, а это не так.
Может, это прояснит. У нас в Elasticsearch 3 сотрудника:
{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
изменилось.
company.id
,company.name
,company.address
и т. Д. - person lmazgon   schedule 01.02.2017