Эффективная подстрока Поиск в DynamoDB - PullRequest
0 голосов
/ 20 ноября 2018

Это контекст моей ситуации:

  • У меня есть большая база данных в DynamoDB с 250 000 элементов.(Пример) таблица
  • Я хочу иметь возможность "поиска по подстроке" по 3 атрибутам, получая список всех элементов, соответствующих подстрокам.
  • Атрибуты iжелание иметь возможность поиска может иметь одно и то же значение среди разных элементов.
  • Мой хэш-ключ - это идентификатор (единственный атрибут, который действительно отличает элементы).
  • Я использую реагировать нативнокак клиент
  • В моей схеме есть эти "типы запросов" запросы

Где я:

  • Iсначала попытался выполнить запрос с помощью запроса listCaballos, добавив пользовательский ввод в качестве фильтра к запросу и рекурсивно используя nextToken для просмотра всей таблицы (без использования вторичных индексов), но потребовалось 6 минут, чтобы просмотреть таблицу и вернуть элементы,

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

  • Я слышал, что Elastic Search может помочь.

Есть предложения?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Это не эффективно в DynamoDB.Несмотря на то, что вы можете создавать вторичные индексы для поиска «begin_with», возможность подстроки («содержит») имеется только для фильтров, которые неэффективны в большом наборе данных (поскольку DynamoDB будет использовать IOPS для запроса всех, а затем применять фильтр).

Этот вид требования эффективен для индексации базы данных с использованием другой службы, например AWS ElasticSearch или CloudSearch, чтобы можно было применить запрос поверх этой службы и настроить непрерывную индексацию.

Начало работы

0 голосов
/ 23 ноября 2018

Вы не сможете использовать вторичные индексы для создания (разумного) обобщенного поиска по подстроке.

Есть много способов решить вашу проблему.Здесь я представляю некоторые из них, и это ни в коем случае не является исчерпывающим.

DynamoDB -> CloudSearch

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

CloudSearch

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

RDS

Вы можете просто использовать какую-либо базу данных SQL.Большинство из них поддерживают полнотекстовый поиск.Вы даже можете использовать AWS Aurora Serverless, если не хотите управлять экземплярами базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...