更新:随着 Cloud Functions for Firebase 的发布,还有另一种优雅的方法可以通过 Functions 将 Firebase 链接到 Algolia。这里的权衡是 Functions/Algolia 几乎是零维护,但可能比在 Node.js 中自己动手的成本更高。
目前 Firebase 中没有内容搜索。随着 API 的不断扩展,许多更常见的搜索场景(例如按属性搜索)将被纳入 Firebase。
与此同时,当然可以自己种植。然而,搜索是一个庞大的主题(想想创建一个庞大的实时数据存储),被大大低估了,并且是您的应用程序的一个关键功能——不是您想要的临时功能,甚至不是依赖 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>
这里有一个示例和一个用于简化集成的第三方库。