elasticsearch V. s. MongoDB для фильтрации приложений [закрыто]


этот вопрос заключается в том, чтобы сделать архитектурный выбор, прежде чем углубляться в детали экспериментов и реализации. Речь идет о пригодности, с точки зрения масштабируемости и производительности, elasticsearch V. S.MongoDB для несколько конкретной цели.

гипотетически оба хранят объекты данных, которые имеют поля и значения, и позволяют запрашивать это тело объектов. Таким образом, предположительно фильтрация подмножеств объектов в соответствии с полями, выбранными ad-hoc, является чем-то подходит для обоих.

мое приложение будет вращаться вокруг выбора объектов в соответствии с критериями. Он будет выбирать объекты путем фильтрации одновременно более чем по одному полю, иначе говоря, его критерии фильтрации запросов обычно будут содержать от 1 до 5 полей, а в некоторых случаях и больше. В то время как поля, выбранные в качестве фильтров, будут подмножеством гораздо большего количества полей. Представьте, что существует около 20 имен полей, и каждый запрос является попыткой фильтровать объекты по нескольким полям из этих общих 20 полей (это может быть меньше или больше 20 общих имен полей, существующих, я просто использовал это число, чтобы продемонстрировать отношение полей к полям, используемым в качестве фильтров в каждом дискретном запросе). Фильтрация может быть по наличию выбранных полей, а также по значениям полей, например, отфильтровывая объекты, которые имеют поле A, а их поле B находится между x и y, а их поле C равно w.

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

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

Что вы думаете? И, вы экспериментировали с этим аспектом?

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

спасибо!

1 116

1 ответ:

во-первых, здесь есть важное различие: MongoDB-это база данных общего назначения, Elasticsearch-это распределенная текстовая поисковая система, поддерживаемая Lucene. Люди говорили об использовании Elasticsearch в качестве базы данных общего назначения, но знаю, что это не был его оригинальный дизайн. Я думаю, что базы данных NoSQL общего назначения и поисковые системы направляются на консолидацию, но в настоящее время они происходят из двух очень разных лагерей.

мы используем оба MongoDB и Elasticsearch в моей компании. Мы храним наши данные в MongoDB и используем Elasticsearch исключительно для его возможностей полнотекстового поиска. Мы отправляем только подмножество полей данных mongo, которые нам нужно запросить в elastic. Наш вариант использования отличается от вашего тем, что наши данные Mongo постоянно меняются: запись или подмножество полей записи могут обновляться несколько раз в день, и это может потребовать переиндексации этой записи на elastic. Только по этой причине, используя Эластик в качестве подошвы хранилище данных не является хорошим вариантом для нас, так как мы не можем обновить выбранные поля; нам нужно будет переиндексировать документ полностью. Это не эластичное ограничение, это то, как работает Lucene, базовая поисковая система за elastic. В вашем случае тот факт, что записи не будут изменены после сохранения, избавляет вас от необходимости делать этот выбор. Сказав это, если безопасность данных является проблемой, я бы дважды подумал об использовании Elasticsearch в качестве единственного механизма хранения ваших данных. Он может попасть туда в какой-то момент, но я не уверен, что это еще есть.

с точки зрения скорости, не только Elastic/Lucene наравне со скоростью запроса Mongo, в вашем случае, когда "очень мало констант, с точки зрения которых поля используются для фильтрации в любой момент", это может быть на порядки быстрее, особенно по мере того, как наборы данных становятся больше. Разница заключается в базовых реализациях запрос:

  • Elastic / Lucene используйте Векторная Модель Пространства и инвертированных индексов на Поиск Информации, которые являются высокоэффективными способами сравнения сходства записей с запросом. Когда вы запрашиваете Elastic / Lucene, он уже знает ответ; большая часть его работы заключается в ранжировании результатов для вас по наиболее вероятным, которые соответствуют вашим условиям запроса. Это важный момент: поисковые системы, в отличие от баз данных, не могут гарантировать вам точные результаты; они ранжируют результаты по тому, насколько близко они подходят к вашему запросу. Это просто так бывает, что в большинстве случаев результаты близки к точным.
  • подход Монго является более универсальным хранилищем данных; он сравнивает документы JSON друг с другом. Вы можете получить отличную производительность из него всеми средствами, но вам нужно тщательно обработать ваши индексы, чтобы соответствовать запросам, которые вы будете запускать. В частности, если у вас есть несколько полей, по которым вы будете запрашивать, вам нужно тщательно обработать ваш составные ключи так, что они уменьшают набор данных это будет запрошено как можно быстрее. Например, ваш первый ключ должен отфильтровать большую часть вашего набора данных, ваш второй должен дополнительно отфильтровать то, что осталось, и так далее и так далее. Если ваши запросы не соответствуют ключам и порядку этих ключей в определенных индексах, ваша производительность снизится совсем немного. С другой стороны, Mongo-это настоящая база данных, поэтому, если точность-это то, что вам нужно, ответы, которые она даст, будут на месте.

для истекающих старых записей, Эластик имеет встроенную функцию TTL. Монго только что представил его в версии 2.2, я думаю.

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