当前位置:  开发笔记 > 编程语言 > 正文

如何在firebase上执行sql"LIKE"操作?

如何解决《如何在firebase上执行sql"LIKE"操作?》经验,为你挑选了2个好方法。

我正在使用firebase进行数据存储.数据结构如下:

products:{
   product1:{
      name:"chocolate",
   }
   product2:{
      name:"chochocho",
   }
}

我想对这些数据执行自动完成操作,通常我会像这样编写查询:

"select name from PRODUCTS where productname LIKE '%" + keyword + "%'";

因此,对于我的情况,例如,如果用户输入"cho",我需要同时带上"chocolate"和"chochocho".我考虑将所有数据放在"产品"块下,然后在客户端进行查询,但这可能需要大量数据库的内存.那么,我该如何执行sql LIKE操作呢?

谢谢



1> Kato..:

更新:随着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());
   });
}

要进行搜索时查询索引:


 
 

这里有一个示例和第三方库来简化集成.


这在2016年仍然相关吗?
遗憾的是,您必须升级到Blaze Plan才能将Firebase云功能与Algolia一起使用

2> Ced..:

我相信你能做到:

admin
.database()
.ref('/vals')
.orderByChild('name')
.startAt('cho')
.endAt("cho\uf8ff")
.once('value')
.then(c => res.send(c.val()));

这将找到名称以cho开头的val.

资源

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有