我正在使用firebase进行数据存储.数据结构如下:
products:{ product1:{ name:"chocolate", } product2:{ name:"chochocho", } }
我想对这些数据执行自动完成操作,通常我会像这样编写查询:
"select name from PRODUCTS where productname LIKE '%" + keyword + "%'";
因此,对于我的情况,例如,如果用户输入"cho",我需要同时带上"chocolate"和"chochocho".我考虑将所有数据放在"产品"块下,然后在客户端进行查询,但这可能需要大量数据库的内存.那么,我该如何执行sql LIKE操作呢?
谢谢
更新:随着Cloud Functions for Firebase的发布,通过功能将Firebase连接到Algolia,还有另一种优雅的方法.这里的权衡是函数/ Algolia几乎没有维护,但可能比在Node中使用自己的滚动成本更高.
目前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('.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()); }); }
要进行搜索时查询索引:
这里有一个示例和第三方库来简化集成.
我相信你能做到:
admin .database() .ref('/vals') .orderByChild('name') .startAt('cho') .endAt("cho\uf8ff") .once('value') .then(c => res.send(c.val()));
这将找到名称以cho开头的val.
资源