Javascript 如何执行sql";例如;火基行动?

Javascript 如何执行sql";例如;火基行动?,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我正在使用firebase进行数据存储。数据结构如下所示: products:{ product1:{ name:"chocolate", } product2:{ name:"chochocho", } } "select name from PRODUCTS where productname LIKE '%" + keyword + "%'"; 我想对此数据执行自动完成操作,通常我会这样编写查询: products:{ produc

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

products:{
   product1:{
      name:"chocolate",
   }
   product2:{
      name:"chochocho",
   }
}
"select name from PRODUCTS where productname LIKE '%" + keyword + "%'";
我想对此数据执行自动完成操作,通常我会这样编写查询:

products:{
   product1:{
      name:"chocolate",
   }
   product2:{
      name:"chochocho",
   }
}
"select name from PRODUCTS where productname LIKE '%" + keyword + "%'";
因此,对于我的情况,例如,如果用户键入“cho”,我需要同时带来“chocolate”和“chochocho”。我考虑将所有数据置于“products”块下,然后在客户机上进行查询,但是对于一个大型数据库来说,这可能需要大量内存。那么,如何执行类似sql的操作呢


感谢更新:随着Firebase云函数的发布,还有另一种优雅的方法可以做到这一点。这里的折衷是函数/Algolia几乎是零维护的,但成本可能比您自己的in-roll节点要高

Firebase中目前没有内容搜索。随着API的不断扩展,许多更常见的搜索场景(如按属性搜索)将被烘焙到Firebase中

同时,你也可以自己种植。然而,搜索是一个巨大的主题(比如创建一个巨大的实时数据存储),它被大大低估了,并且是应用程序的一个关键功能——而不是一个你想临时或甚至依靠Firebase这样的人来为你提供的功能。因此,使用可扩展的第三方工具来处理索引、搜索、标记/模式匹配、模糊逻辑、加权排名等通常更简单

Firebase博客提供了一个简单的方法,可以将一个快速但功能极其强大的搜索引擎集成到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());
   });
}
var Firebase=require('Firebase');
var ElasticClient=require('elasticsearchclient')
//初始化我们的ElasticSearchAPI
var client=new-ElasticClient({host:'localhost',端口:9200});
//侦听Firebase数据的更改
var fb=newfirebase('.firebaseio.com/widgets');
fb.on('child_added',createOrUpdateIndex);
fb.on('child_changed',createOrUpdateIndex);
fb.on(“移除儿童”,移除索引);
函数createOrUpdateIndex(快照){
client.index(this.index,this.type,snap.val(),snap.name())
.on('data',函数(data){console.log('index',snap.name());})
.on('error',函数(err){/*处理错误*/});
}
函数removeIndex(捕捉){
client.deleteDocument(this.index、this.type、snap.name()、函数(错误、数据){
if(error)console.error('删除失败',snap.name(),错误);
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>

ejs.client=ejs.jQueryClient('http://localhost:9200');
client.search({
索引:“firebase”,
键入:“小部件”,
正文:ejs.Request().query(ejs.MatchQuery('title','foo'))
},函数(错误,响应){
//处理响应
});

弹性搜索解决方案基本上绑定到add set del,并提供了一个可以完成文本搜索的get by。 然后将内容保存在mongodb中

虽然我喜欢和Recomand elastic搜索项目的成熟度,但也可以不用另一台服务器,只使用firebase数据库。 这就是我的意思: ()

对于索引部分,功能主要包括:

  • JSON使文档字符串化
  • 删除所有属性名和JSON以只保留数据 (regex)
  • 删除所有xml标记(因此也是html)和属性(记住 旧指南“数据不应在xml属性中”)仅保留 如果存在xml或html,则为纯文本
  • 删除所有特殊字符并替换为空格(regex)
  • 将多个空间的所有实例替换为一个空间(正则表达式)
  • 拆分为空间和循环:
  • 对于每个单词,在中的某些索引结构中将引用添加到文档中 您的db tha基本上包含以childs命名的childs 使用转义版本“ref/inthedatabase/dockey”命名
  • 然后像普通firebase应用程序那样插入文档
  • 在oxyzen实现中,文档的后续更新实际上读取并更新索引,删除不再匹配的单词,然后添加新单词


    后续的单词搜索可以直接在单词子级中查找文档。使用hits实现多词搜索

    我相信您可以做到:

    admin
    .database()
    .ref('/vals')
    .orderByChild('name')
    .startAt('cho')
    .endAt("cho\uf8ff")
    .once('value')
    .then(c => res.send(c.val()));
    
    这将查找名称以cho开头的VAL

    firebase上的SQL“LIKE”操作是可能的

    let node = await db.ref('yourPath').orderByChild('yourKey').startAt('!').endAt('SUBSTRING\uf8ff').once('value');
    

    这个查询对我来说是有效的,它看起来像MySQL中的下面语句

    从商店广告中选择*,其中大学喜欢%ps%


    query=database.getReference().child(“StoreAds”).orderByChild(“University”).startAt(“ps”).endAt(“\uf8ff”)

    啊,谢谢你,但我实际上在android应用程序中使用firebase,而且我对javascript知之甚少。你能给我一个链接或者一个小例子,比如这个javascript例子,它是用java代码编写的吗?我还将尝试理解现在的javascript代码:)这在2016年仍然相关吗?概念上相关。API调用的语法略有不同。嗨,加藤,我在这里发布了一个关于使用新Firebase进行闪光灯设置的问题,希望你能提供一些知识!我会非常感激的,谢谢!遗憾的是,你必须升级到Blaze计划才能在Algolia中使用Firebase云函数你找到了使用Firebase的方法吗?@FaridAlHaddad我问这个问题已经很久了,我甚至不记得问过了,但看起来我可能还没有找到解决方案并决定做其他事情。哈哈。。解决办法是什么?你能分享一下吗?Thanks@FaridAlHaddad我真的不记得了,但看起来很多人都在寻找这个问题的答案,所以我会再次搜索t