Я пытаюсь запросить таблицу DynamoDB и проверить, включен ли запрос, который я передаю, в ключ раздела индекса таблицы.
Например, у меня есть таблица DynamoDB с примерами данных ниже.
+-----+----------------+---------------------------------------------+
| id | title | description |
+-----+----------------+---------------------------------------------+
| id1 | My Title One | This is an awesome item in my database |
| id2 | My Title Two | This is also an awesome item in my database |
| id3 | The Item Three | Hello World |
+-----+----------------+---------------------------------------------+
У меня есть глобальный указатель на свойство title. Ключ первичного раздела - id.
Я хочу взять поисковый запрос от пользователя и сопоставить все элементы заголовка.
У меня есть следующий код, который точно соответствует названию термина пользователя.
const params = {
ExpressionAttributeValues: {
":q": {
S: req.query.q
}
},
KeyConditionExpression: "title = :q",
TableName: "MyTable",
IndexName: 'title-index'
};
dynamodb.query(params, (err, titles) => {
if (err) {
return res.status(500).send({"Error": "Error"});
}
titles = titles.Items
.map(item => AWS.DynamoDB.Converter.unmarshall(item));
return res.send(titles);
});
Поэтому, если пользователь ищет My Title One, он вернет результат с идентификатором id1. Теперь я хочу добавить поддержку, если пользователь вводит My Title, я хочу, чтобы он возвращал идентификаторы id1 И id2. В настоящее время он ничего не возвращает, поскольку ничего не совпадает.
Я знаю, что это возможно с использованием сканирования DynamoDB вместо запросов, но из-за того, что в моей таблице так много элементов, сканирование в этом случае кажется таким неэффективным с точки зрения производительности и стоимости.
Как проще всего этого добиться?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы не сможете сделать это с помощью запроса DynamoDB. Запрос DynamoDB требует точного сравнения с первичным ключом. Вам придется использовать сканирование, которое, как вы отметили, может быть очень неэффективным и дорогим в зависимости от размера вашей таблицы.
Даже если бы это было эффективно и дешево, сканирование все равно не лучший вариант для реализации функции поиска. Что, если ваш пользователь ищет "мое название"? В Dynamo нет функций для сравнения строк без учета регистра. Вам нужно будет сохранить другой атрибут в таблице с более доступной для поиска версией полей, которые вы хотите сканировать и фильтровать.
Если вам нужна реальная функция поиска, вам нужно будет использовать что-то еще. Подключить Dynamo и ElasticSearch «относительно» просто (если вы знаете ElasticSearch). Вы можете использовать поток DynamoDB с триггером Lambda для вставки / обновления / удаления индекса ElasticSearch при изменении таблицы. Затем вы должны выполнить поиск по заголовку в ElasticSearch. Если вы раньше работали с ElasticSearch, это не так уж и плохо. Если нет, придется немного научиться.
Другой вариант, о котором вы, вероятно, не хотите слышать, - отказаться от Dynamo и использовать реляционную базу данных и использовать запрос LIKE с некоторыми подстановочными знаками.
К сожалению, нет хорошего способа реализовать достойный поиск поверх только Dynamo.