Запрос индекса DynamoDB включает

Я пытаюсь запросить таблицу 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 вместо запросов, но из-за того, что в моей таблице так много элементов, сканирование в этом случае кажется таким неэффективным с точки зрения производительности и стоимости.

Как проще всего этого добиться?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
533
1

Ответы 1

Вы не сможете сделать это с помощью запроса DynamoDB. Запрос DynamoDB требует точного сравнения с первичным ключом. Вам придется использовать сканирование, которое, как вы отметили, может быть очень неэффективным и дорогим в зависимости от размера вашей таблицы.

Даже если бы это было эффективно и дешево, сканирование все равно не лучший вариант для реализации функции поиска. Что, если ваш пользователь ищет "мое название"? В Dynamo нет функций для сравнения строк без учета регистра. Вам нужно будет сохранить другой атрибут в таблице с более доступной для поиска версией полей, которые вы хотите сканировать и фильтровать.

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

Другой вариант, о котором вы, вероятно, не хотите слышать, - отказаться от Dynamo и использовать реляционную базу данных и использовать запрос LIKE с некоторыми подстановочными знаками.

К сожалению, нет хорошего способа реализовать достойный поиск поверх только Dynamo.

Другие вопросы по теме