2012-05-11 13 views
26

Я рассматриваю использование Firebase для приложения, которое должно заставить людей использовать полнотекстовый поиск по коллекции из нескольких тысяч объектов. Мне нравится идея предоставления клиентского приложения (не беспокоясь о размещении данных), но я не уверен, как обращаться с поиском. Данные будут статичными, поэтому сама индексация не является большой проблемой.Firebase и индексирование/поиск

Предполагаю, что мне понадобится дополнительная служба, которая запускает запросы и возвращает дескрипторы объектов Firebase. Я могу развернуть такую ​​услугу в определенном месте, но тогда мне приходится беспокоиться о ее доступности масштабируемости объявлений. Хотя я не ожидаю слишком большого трафика для этого приложения, он может достигать нескольких тысяч одновременно работающих пользователей.

Архитектурные мысли?

ответ

27

Долгосрочная, Firebase будет иметь более продвинутые запросы, поэтому, надеюсь, она будет поддерживать подобные вещи напрямую, без необходимости делать что-либо особенное. До тех пор у вас есть несколько вариантов:

  1. Написать код сервера для поиска. Самый простой способ - запустить код сервера, отвечающий за индексирование/поиск, как вы упомянули. У Firebase есть клиент Node.JS, так что это будет простой способ связать службу с Firebase. Вся передача данных все равно может произойти через Firebase, но вы должны написать службу Node.JS, которая следит за «поисковыми запросами» клиента в определенном месте в Firebase, а затем «отвечает», записав результирующий набор обратно в Firebase, для клиент для потребления.
  2. Храните индекс в Firebase, при этом клиенты автоматически обновляют его. Если вы хотите стать очень умным, вы можете попробовать внедрить схему без сервера, где клиенты автоматически индексируют свои данные при их записи ... Таким образом, индекс для полнотекстового поиска будет храниться в Firebase и когда клиент записывает новый элемент в коллекцию, он будет также отвечать за обновление индекса соответствующим образом. И чтобы выполнить поиск, клиент будет напрямую потреблять индекс для построения набора результатов. Это действительно имеет смысл для простых случаев, когда вы хотите индексировать одно поле сложного объекта, хранящегося в Firebase, но для полнотекстового поиска это, вероятно, будет довольно грубым. :-)
  3. Храните индекс в Firebase с кодом сервера, обновляющим его. Вы можете попробовать гибридный подход, когда индекс хранится в Firebase и используется клиентами для выполнения поиска, но вместо того, чтобы клиенты обновляли индекс, у вас был бы код сервера, который обновляет индекс, когда новые элементы будут добавлены в коллекция. Таким образом, клиенты могут искать данные, когда ваш сервер не работает. Они просто могут получить устаревшие результаты, пока ваш сервер не поймает индексацию.

До тех пор, пока Firebase не предложит более сложные запросы, # 1, вероятно, лучше всего, если вы захотите запустить небольшой код сервера. :-)

+1

Упс. Просто перечитайте свой комментарий, что ваши данные являются статическими. В этом случае опция №2 не нужна, и опция №3 становится проще. Вам все еще нужно выяснить, как создать индекс полнотекстового поиска, сохранить его в Firebase и запросить у клиента напрямую, но он должен быть полностью выполнимым. –

+0

Спасибо, что подтвердили, что мне не хватает чего-то очевидного.Я думаю, что # 1, вероятно, правильный путь - повторное внедрение полнотекстового индекса в JavaScript не похоже на хорошее использование моего времени :-) –

+0

Взгляните на http://lunrjs.com/ для полного полнотекстового индексационного решения на основе JS. – Nemo