Индексируйте потоки DynamoDB для эластичного поиска

#elasticsearch #amazon-dynamodb #amazon-dynamodb-streams

#elasticsearch #amazon-dynamodb #amazon-dynamodb-streams

Вопрос:

У меня есть требование для реализации следующих объектов в таблице DynamoDB

введите описание изображения здесь

Я сохранил эти объекты в DynamoDB, как показано ниже.

  • Ключ раздела: PROJ #Идентификатор проекта: идентификатор страны
  • Ключ сортировки: название проекта
  • Компания: данные компании в виде документа JSON

Поскольку это отношение «один ко многим», N количество проектов одной и той же компании создаст N количество записей проекта, и в их атрибуте Company будут сохранены одинаковые сведения о компании. Причина этого заключается в том, что наиболее важная точка доступа к данным находится через ProjectID и CountryId (предположим, что я не могу изменить этот дизайн БД)

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

Но мне нужно проиндексировать эти данные в следующем формате, чтобы при получении сведений из elastic search данные не дублировались

 {
    "id" : 1
    "name" : "ABC",
    "description" : "description",
    "address" : "address",
    "projects" : [
        {
            "id" : 10,
            "name" : "project 1",
            "countryId" : 10
        },
        {
            "id" : 20,
            "name" : "project 1",
            "countryId" : 10
        }
    ]
}
 

Во время создания записи, поскольку записи проекта создаются как отдельные записи, существует ли какой-либо рекомендуемый или стандартный способ, которым я могу захватить все записи проекта компании и создать приведенный выше документ json и проиндексировать его в эластичном поиске?

Комментарии:

1. Я бы рекомендовал использовать GSI с идентификатором компании, поэтому, когда вы отправляете запрос, вы передаете идентификатор компании и получаете все записи, связанные с компанией.

Ответ №1:

Вот как я бы подошел к этому вопросу :

  1. В elastic идентификатором документа будет идентификатор компании
  2. Что вы можете сделать, так это создать лямбда-выражение, которое запускается на основе потоков изменений, и использовать обновление по запросу elastic для запроса документа и БЕЗБОЛЕЗНЕННЫХ сценариев для обновления раздела проекта документа, это будет работать для менее частых изменений.