Автозаполнение с помощью java, Redis, Elastic Search, Mongo
Мне нужно реализовать автозаполнение с более чем 500 000 имен, которые позже могут увеличиться до более чем 4 миллионов имен.
Backend - это вызов веб-службы Java REST с использованием Spring. Должен ли я использовать MongoDB, Redis или Elasticsearch для хранения и запроса / поиска имен?
2 ответа
Это критически важный вариант использования поиска, а MongoDB и Redis идеально подходят для поиска на основе ключей и не используются для целей поиска, в то время как Elasticsearch - это распределенная поисковая система, созданная специально для такого варианта использования.
Перед тем, как выбрать систему, вы должны знать, как работает ваша функция внутри, и ниже, как ее выбрать.
Нефункциональные требования к вашей функции
- Каким будет общее количество поисковых запросов в секунду (QPS)?
- Как часто вы будете обновлять документы (например, имена в вашем примере).
- Что такое SLA после имен в обновленных и появляющихся в результатах поиска?
- SLA для результатов поиска.
Некоторые функциональные требования.
- Как должно выглядеть автозаполнение, префиксный, инфиксный поиск по именам?
- Минимальное количество символов, которое пользователь должен ввести, прежде чем показывать им результаты автозаполнения.
- Как часто могут меняться указанные выше требования.
Elasticsearch индексирует документы в инвертированном индексе и работает с сопоставлением токенов (которые можно легко настроить в соответствии с требованиями бизнеса), что обеспечивает сверхбыстрый поиск. Redis и MongoDB не имеют этой внутренней структуры и не должны использоваться для этого варианта использования. Вы не должны сомневаться в выборе Elasticsearch вместо них для реализации автозаполнения.
Поскольку автозаполнение является одной из важнейших функций поиска, существует отличный блог, который вам следует прочитать, чтобы понять различные подходы, предлагаемые Elasticsearcg, и их компромисс.
Вы можете использовать RediSearch (https://oss.redislabs.com/redisearch/). Это бесплатная поисковая машина, построенная поверх Redis как RedisModule. Он также имеет функцию автозаполнения.