[ideas] Full text search for mongodb

Werdna

Я предлагаю читателям раздела иногда писать какие-то свои интересные идеи, чтобы на форуме их обсуждать.
Предлагаю обсудить такую штуку, насколько она интересна и нужна миру? Кратко опишу так.
Для понимания того что я пишу в принципе надо просто знать что такое mongodb, что там есть шардинг и репликации.
1. Программка притворяется slave-репликой для любого mongod, не фактически только выступает как backup. Возможно, что также выступает в роли арбитра при голосовании за нового мастера. не сильно важно, главное что она получает точную реплику всех коллекций базы.
2. В конфиге указывается, какие коллекции принимать для построения full text search index, какие поля играют какую роль.
3. При реалтаймовом получении обновлений, программа на лету перестраивает поисковый индекс.
На выходе — либо поисковый индекс реального времени вообще, либо регулярные дампы и диффы от предыдущих.
Таким образом получаем реализацию полнотекстового поиска для mongodb. Помимо собственно полнотекстового поиска можно ещё ставить фильтры по полям, которые тоже можно задавать в конфиге.
Ваши мысли? Нужна ли такая штука? Чем бы вы её дополнили?
Как комментарий я приведу пример.

Werdna

Пример.
Форум, коллекция posts — посты.
Каждый пост среди прочих имеет свойства: forum, afftar, create_time, visibility_type, access_type, text
В конфиге указываем, что по полю text надо строить полнотекстовый индекс.
Также указываем, что поле forum, XXX_type и поле afftar могут выступать фильтрами на поиск по точному значению.
Ещё указываем, что поле create_time может выступать фильтром по диапазону.
Таким образом, реализуется "из коробки" полнотекстовая искалка по Монгодб-коллекции.

okis

такая штука есть, например, в elasticsearch: http://github.com/richardwilly98/elasticsearch-river-mongod...
только там не slave, а отдельный сервис, который выбирает обновления из oplog

Werdna

Спасибо за ссылку.
На яве, что-то как-то не впечатлило с первого взгляда.

s507040

а такой коннектор к Solr/ElasticSearch с последующей настройкой того же Solr`а не решит задачу?

Werdna

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

luna89

Зачем все это, когда есть постгрес с полнотекстом из коробки?

Fragaria

О, кто-то прикрутил-таки сфинкс к монге? Когда монговцы приезжали в Москву, там был один товарищ (из бегуна, что ли который задавал кучу вопросов по поводу возможной интеграции сфинкса и монги и очень жаловался, что приходится делать кучу костылей и все равно работает хуево. Этот чувак удивительно много и удивительно хуево разговаривал на английском, но разработчик монги каким-то чудом его все-таки понимал :)

Werdna

Зачем все это, когда есть постгрес с полнотекстом из коробки?
Потому что реляционные базы нужны только в 10% случаев их использования.
Просто раньше ничего другого не было дешевого, вот и хранили всё в реляционных базах.

Maurog

Потому что реляционные базы нужны только в 10% случаев их использования.
извините, я плохо понимаю о чем речь
вот пролистал вики: http://ru.wikipedia.org/wiki/MongoDB
внимание, вопрос:
поддерживает ли mongo db ограничения (constrains) ?
есть ли транзакции хотя бы в каком-то виде ?
или это настолько "другая" штука, что такие (как мне кажется) важные возможности не нужны?

katrin2201

настолько "другая" штука
Да, зовется NoSQL

okis

поддерживает ли mongo db ограничения (constrains) ?
есть ли транзакции хотя бы в каком-то виде ?
unique есть
есть атомарные операции
транзакции нет

luna89

Просто раньше ничего другого не было дешевого, вот и хранили всё в реляционных базах.
Berkley DB была издавна.
А почему люди корпели над созданием постгреса или мускула, если можно было сделать намного более примитивную монгу и закрыть 90% потребностей?

luna89

поддерживает ли mongo db ограничения (constrains) ?
Монго не поддерживает бэкап, что является нонсенсом для современной СУБД.

Dasar

Да, зовется NoSQL
это слишком примитивная(слишком модная) классификация, т.к. NoSql база может быть и иерархической, и сетевой, и key/value, и объектно-ориентированной, и даже реляционной.
MongoDb ближе к key/value-базе, где value может являться сложным структурным типом (а не только простым).

katrin2201

Согласен, но учитывая удивление человека относительно отсутствия констрейнтов и транзакций - имхо само то =)

Dasar

Согласен, но учитывая удивление человека относительно отсутствия констрейнтов и транзакций - имхо само то =)
в целом, ни то, ни другое не связано с sql-ем.
ps
те же транзакации, например, NTFS держит

katrin2201

NoSQL родился и стал популярен для/из-за перформанса и скалабилити на больших массивах данных.
Перформанс и скалабилити там появились не из-за того, что внезапно была придумана какая-то более хорошая модель данных, а из-за того, что там отказались от большинства плюшек реляционных баз данных. То есть нету реляций, нету констрейнтов, как правило только eventual consistency, минимум транзакционной поддержки (обычно есть только атомарный доступ к отдельному элементу).
Соответственно, раз удивляется отсутствию этих вещей, я и посчитал разумным дать ссылку сразу на все направление, выросшее из идеи отказаться от этих вещей.
Что не нравится?

ava3443

те же транзакации, например, NTFS держит
так держит, что лишь начиная с висты, и то Microsoft не рекомендует на них закладываться т.к. в будущих версиях вероятно всё переделают - http://msdn.microsoft.com/en-us/library/windows/desktop/hh80...

pilot

Потому что реляционные базы нужны только в 10% случаев их использования.
:facepalm:
пианист такой пианист

okis

Монго не поддерживает бэкап, что является нонсенсом для современной СУБД
не понял
там есть утилита, чтобы дамп выгружать и загружать обратно — какой еще нужен бэкап?

luna89

не понял
там есть утилита, чтобы дамп выгружать и загружать обратно — какой еще нужен бэкап?
Это не бэкап, а экспорт. В случае уничтожения дисковой системы или ошибки оператора будут потеряны все данные со времени последнего экспорта.
При нормальном бэкапе в дополнение к полному бэкапу непрерывно архивируются логи повторного выполнения. В результате можно сделать point in time recovery к любому моменту (включая момент непосредственно предшествоваший катастрофе).

Maurog

спасибо, теперь немного больше понимаю :grin:

pilot

пианист такой пианист
Кстати , любителям NoSQL:
With PostgreSQL 9.2, query results can be returned as JSON data types. Combined with the new PL/V8 Javascript and PL/Coffee database programming extensions, and the optional HStore key-value store, users can now utilize PostgreSQL like a "NoSQL" document database, while retaining PostgreSQL's reliability, flexibility and performance.
"Native JSON support in PostgresSQL provides an efficient mechanism for creating and storing documents for web APIs. We use front-end libraries like jQuery to request tabular and tree-structured data; and the new features make it convenient and provide performance advantages in retrieving that data as JSON, " said Taras Mitran, Senior Architect, IVC Inc.

luna89

With PostgreSQL 9.2, query results can be returned as JSON data types.
Это можно было всегда делать. В 9.2 сделали чуть удобнее и устроили по этому поводу пиар.

okis

да, такую штуку у них часто спрашивают
но кто-то сам это сделал: http://github.com/wordnik/wordnik-oss/blob/master/modules/m...

luna89

Я не думаю что бэкап можно реализовать в виде сторонней тулзы. В противном случае такую тулзу приделали бы к MySQL.

okis

он вычитывает оплог
mysqlbackup, скорее всего, так же делает — просто он уже есть в комплекте, а у монги нет

pilot

Это можно было всегда делать. В 9.2 сделали чуть удобнее и устроили по этому поводу пиар.
Стало удобнее и быстрее, вроде как.

Werdna

поддерживает ли mongo db ограничения (constrains) ?
есть ли транзакции хотя бы в каком-то виде ?
или это настолько "другая" штука, что такие (как мне кажется) важные возможности не нужны?
Нет, в Монге скорее вложенные документы рулят, а ограничений в принципе нет.
Транзакционности тоже нет. Единственное что точно известно — это атомарность записи или модификации одного документа (записи).
Это другого типа БД. Например, она абсолютно не годится для хранения информации финансового толка.

Werdna

Berkley DB была издавна.
А почему люди корпели над созданием постгреса или мускула, если можно было сделать намного более примитивную монгу и закрыть 90% потребностей?
Думаю, что те 10% задач куда важнее было решить системно РСУБД. Вот и делали Постгресы и Мускули.
Для многих их оставшихся 90% и эти задачи решались РСУБД. Худо-бедно, но решались. У кого не решались — писали самописные решения.
Ты думаешь Монгу написать это так просто было? Её придумать сложно было, архитектурно именно. Уверен, что она в черновиках уже сроком не меньше 10 лет писалась.

Werdna

Монго не поддерживает бэкап, что является нонсенсом для современной СУБД.

Из коробки умеет.
С одной стороны ты можешь число реплик увеличивать, по сути это и есть бэкап.
Если тебе нужен бэкап именно одного сторейджа, то запросто решается и эта задача. Но если у тебя развёрнутая система с репликацией 3x, одна из реплик в другом ДЦ, то зачем?

Werdna

Это не бэкап, а экспорт. В случае уничтожения дисковой системы или ошибки оператора будут потеряны все данные со времени последнего экспорта.
При нормальном бэкапе в дополнение к полному бэкапу непрерывно архивируются логи повторного выполнения. В результате можно сделать point in time recovery к любому моменту (включая момент непосредственно предшествоваший катастрофе).
Я уже тут написал, что твоя задача решается созданием N реплик.
Делай реплики на разных континентах. Делай реплики на разных планетах. Делай реплики в разных галактиках.

6yrop

Для многих их оставшихся 90% и эти задачи решались РСУБД. Худо-бедно, но решались. У кого не решались — писали самописные решения.
Откуда такие цифры, из твоего опыта? Можешь рассказать в подробностях из своего опыта три провальных проекта по причине использования РСУБД (а монго в этих случаях всё разрулила бы)?

6yrop

Потому что реляционные базы нужны только в 10% случаев их использования.

Имхо, базы без схемы не получат широкого применения. Я много где читал такую точку зрения, сейчас с ходу хорошие ссылки не нашел, но вот например http://citforum.ru/database/articles/mr_vs_dbms/2.shtml1

okis

В противном случае такую тулзу приделали бы к MySQL.
кстати, такое очень даже делают: на c++, например; на днях нашел похожую штуку, но на руби.
В смысле, можно слушать обновления и произвольно их обрабатывать, не только бэкапить.

pilot

В смысле, можно слушать обновления и произвольно их обрабатывать, не только бэкапить.
Такими темпами глядишь скоро и репликацию изобретете :o

luna89

Делай реплики на разных континентах. Делай реплики на разных планетах. Делай реплики в разных галактиках.
Во-первых, если в коде программы которая работает с базой будет ошибка (или человек случайно зайдет на продакшен базу вместо своей локальной и удалит таблицу, или ошибка будет в самой СУБД то неверная команда отреплицируется на все реплики и данные будут уничтожены.
Во-вторых, под репликацию нужна отдельная машина или несколько машин, способных накатывать лог без отставания, что является бесполезной тратой ресурсов.

Werdna

Откуда такие цифры, из твоего опыта? Можешь рассказать в подробностях из своего опыта три провальных проекта по причине использования РСУБД (а монго в этих случаях всё разрулила бы)?
У меня не было трёх провальных проектов. :)
Но вот держи пример. ЖЖ — типичный пример проекта, который дышит на ладан.
Если его перевести на Монгу, то станет хорошо.
Опять же, если это сделать прямыми руками, а не текущими суповцами.

Werdna

Я не думаю что бэкап можно реализовать в виде сторонней тулзы.
Это распространённая практика.

luna89

Ты думаешь Монгу написать это так просто было? Её придумать сложно было, архитектурно именно.
А что такого сложного в архитектуре монги?

luna89

ЖЖ — типичный пример проекта, который дышит на ладан.
По-моему довольно шустро работает.

margadon

пока ддосов нет
хотя это не совсем к базе

pilot

Во-первых, если в коде программы которая работает с базой будет ошибка (или человек случайно зайдет на продакшен базу вместо своей локальной и удалит таблицу, или ошибка будет в самой СУБД то неверная команда отреплицируется на все реплики и данные будут уничтожены.
Во-вторых, под репликацию нужна отдельная машина или несколько машин, способных накатывать лог без отставания, что является бесполезной тратой ресурсов.
Боюсь представить что будет с пианистом, когда он обнаружит что у РСУБД есть И репликации И бэкап :o
Оставить комментарий
Имя или ник:
Комментарий: