2013-02-11 3 views
2

Мы разрабатываем приложение, которое может выполнять поиск по продуктам в нашей базе данных. База данных, которую мы используем, это Amazon Dynamo DB, и в любой момент времени будет храниться не менее 10 миллионов информации о продукте.Лучший способ выполнить поиск

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

Есть ли что-нибудь еще, что мы можем реализовать или позаботиться, чтобы поиск происходил очень быстро. Реализация выполняется на Java.

Заранее спасибо.

+2

Вы должны быть более конкретными только о том, что вы подразумеваете под «поиском» - точное совпадение, частичное совпадение, подстановочный знак, слова simialr, soundex и т. Д. Ваша БД должна быть проиндексирована по-разному в зависимости от типов поиска, которые вы хотите позволять. –

+0

@JoshGreifer - поиск может быть как точным, так и частичным совпадением – JavaMany

ответ

1

У Dynamodb нет указателей индексов, поэтому вы не сможете быстро искать ничего, кроме первичного ключа.

У вас есть несколько основных вариантов:

  1. Pregenerate результаты поиска и хранения ключа поиска в качестве хэш-ключа и идентификатор результата в диапазоне. Затем вы можете получить все результаты поиска, зайдя на первичный ключ
  2. Используйте другое индексирование для хранения всех идентификаторов. Например CloudSearch
  3. Если вы хотите точные совпадения по названию продукта, хранить их в отдельной таблице с отображением на ид
+0

Точная fucntionality - это поиск пользователем продукта, и отображаются все продукты, соответствующие радиусу 5KM его текущих местоположений. Любые мысли по этому поводу? – JavaMany

+0

@JavaMany Это действительно действительно большой вопрос для вопроса и трудно ответить на SO. Вам нужно будет делать расчеты на расстоянии за элемент.Вероятно, хранить их, используя город, является первичным ключом, поэтому вы можете получить все предметы для своего города и использовать ключ диапазона для точного местоположения (вы можете получить клавиши диапазона + - целое число) –

0

Точная функциональность пользователь ищет продукт и все продукты согласование в отображается радиус 5KM его текущих местоположений. Любые мысли по этому поводу? - JavaMany

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

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

Вы должны найти способ обновить индекс CloudSearch.

Альтернативой является использование AmazonRDS и использование свободного текстового поиска и геопространственных функций MySQL или MS SQL. Конечно, для этого может потребоваться схема (которую я предполагаю, что вы пытаетесь избежать).

Смежные вопросы