вопрос 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
изменилось.