Ответ 1
Обновление: С выпуском Cloud Functions для Firebase появился еще один элегантный способ сделать это, связав Firebase с Algolia через Functions. Компромисс здесь заключается в том, что "Функции/Алголия" практически не требуют обслуживания, но, вероятно, по более высокой цене, чем "сворачивание" в Node.
В Firebase в настоящее время нет поиска контента. Многие из наиболее распространенных сценариев поиска, таких как поиск по атрибуту, будут добавлены в Firebase, поскольку API продолжает расширяться.
Между тем, безусловно, можно вырастить свой собственный. Тем не менее, поиск - это обширная тема (подумайте о создании огромного хранилища данных в реальном времени), которая сильно недооценивается и является критической характеристикой вашего приложения, а не той, которую вы хотите использовать по принципу ad hoc или даже зависите от кого-то вроде Firebase, который предоставит от вашего имени, Таким образом, обычно проще использовать масштабируемый сторонний инструмент для обработки индексации, поиска, сопоставления тегов/шаблонов, нечеткой логики, взвешенного ранжирования и т.д.
Блог Firebase содержит сообщение об индексации с помощью ElasticSearch, в котором описывается простой подход к интеграции быстрой, но чрезвычайно мощной поисковой системы в ваш бэкэнд Firebase.
По сути, это делается в два этапа. Контролируйте данные и индексируйте их:
var Firebase = require('firebase');
var ElasticClient = require('elasticsearchclient')
// initialize our ElasticSearch API
var client = new ElasticClient({ host: 'localhost', port: 9200 });
// listen for changes to Firebase data
var fb = new Firebase('<INSTANCE>.firebaseio.com/widgets');
fb.on('child_added', createOrUpdateIndex);
fb.on('child_changed', createOrUpdateIndex);
fb.on('child_removed', removeIndex);
function createOrUpdateIndex(snap) {
client.index(this.index, this.type, snap.val(), snap.name())
.on('data', function(data) { console.log('indexed ', snap.name()); })
.on('error', function(err) { /* handle errors */ });
}
function removeIndex(snap) {
client.deleteDocument(this.index, this.type, snap.name(), function(error, data) {
if( error ) console.error('failed to delete', snap.name(), error);
else console.log('deleted', snap.name());
});
}
Запросите индекс, если вы хотите сделать поиск:
<script src="elastic.min.js"></script>
<script src="elastic-jquery-client.min.js"></script>
<script>
ejs.client = ejs.jQueryClient('http://localhost:9200');
client.search({
index: 'firebase',
type: 'widget',
body: ejs.Request().query(ejs.MatchQuery('title', 'foo'))
}, function (error, response) {
// handle response
});
</script>
Здесь есть пример и сторонняя библиотека для упрощения интеграции.