Запрос DynamodB для текстового поиска? - PullRequest
0 голосов
/ 31 января 2020

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

Данные таблицы:

itemId  itemName  itemOwners

hash1   abc       [user1, user2]
hash2   abcd      [user1, user3]
hash3   xyz       [user2, user3]

Я должен выполнить поиск по элементу, используя элемент. имя. Прямо сейчас мы сканируем всю таблицу.

  let getItems = {
    TableName: ItemsTable,
    FilterExpression: 'contains (#itemName, :searchValue)',
    ExpressionAttributeNames: { '#itemName': 'itemName' },
    ExpressionAttributeValues: { ':searchValue': searchValue },
  };
  let items = await docClient.scan(getItems).promise();

Затем мы фильтруем результат элементов, если itemOwners содержит идентификатор пользователя для пользователя, выполняющего поиск.

Я хотел бы знать, есть ли лучший способ сделать этот поисковый запрос с DynamodB?

1 Ответ

0 голосов
/ 31 января 2020

Нет способа сделать contains в DynamoDB без условия фильтра. DynamoDB не предназначен для полнотекстового поиска. Тем не менее, есть возможность сделать некоторые возможности текстового поиска от DynamoDB. Я не предлагаю вам, но вы можете. По сути, вы создаете запись для каждой комбинации слово / элемент, которую хотите включить в поиск. Это не учитывает частичное совпадение слов, но это способ получить полное совпадение слов. Это, конечно, требует предварительной обработки всех ваших данных, чтобы сделать их доступными для поиска. Если вы решите go по этому маршруту, я бы порекомендовал использовать потоки DynamoDB для управления обновлением данных поиска. Каждый раз, когда элемент добавляется / обновляется / удаляется из базы данных, вы можете запускать лямбду, чтобы обновить записи поиска для этого элемента. Опять же, не предлагая вам делать это, но вы можете.

Я бы порекомендовал исследовать CloudSearch в качестве альтернативы этому.

...