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

时间:2014-03-19 12:55:13

标签: javascript firebase firebase-realtime-database

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

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

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

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

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

由于

5 个答案:

答案 0 :(得分:25)

更新:随着Cloud Functions for Firebase的发布,linking Firebase to Algolia via Functions还有另一种优雅的方式来实现这一目标。这里的权衡是函数/ Algolia几乎没有维护,但可能比在Node中使用自己的滚动成本更高。

目前Firebase中没有内容搜索。许多更常见的搜索方案(例如按属性搜索)将随着API的不断扩展而融入Firebase。

与此同时,你自己也可以成长。但是,搜索是一个很大的主题(想想创建一个实时数据存储大),被大大低估,并且是您的应用程序的关键功能 - 不是您想要临时或甚至依赖像Firebase这样的人代表您提供的。因此,使用可扩展的第三方工具处理索引,搜索,标记/模式匹配,模糊逻辑,加权排名等等,通常更为简单。

Firebase博客提供了一个blog post on indexing with 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>

There's an example, and a third party lib to simplify integration, here.

答案 1 :(得分:11)

我相信你可以做到:

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

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

source

答案 2 :(得分:1)

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

虽然我喜欢并重新考虑弹性搜索项目的成熟度,但是只使用firebase数据库就可以在没有其他服务器的情况下完成同样的工作。 这就是我的意思: (https://github.com/metaschema/oxyzen

对于索引部分基本上是函数:

  1. JSON将文档字符串化。
  2. 删除所有属性名称和JSON以仅保留数据 (正则表达式)。
  3. 删除所有xml标签(因此也是html)和属性(请记住 旧的指导,&#34;数据不应该在xml属性中#34;)只能离开 如果存在xml或html,则为纯文本。
  4. 删除所有特殊字符并用空格替换(正则表达式)
  5. 用一个空格(正则表达式)替换多个空格的所有实例
  6. 拆分为空格和周期:
  7. 为每个单词添加refs到某个索引结构中的文档 你的数据库基本上包含以带有子项的单词命名的子项 使用&#34; ref / inthedatabase / dockey&#34;
  8. 的转义版本命名
  9. 然后将文档作为普通的firebase应用程序执行
  10. 在oxyzen实现中,文档的后续更新ACTUALLY读取索引并对其进行更新,删除不再匹配的单词,并添加新单词。

    随后搜索单词可以直接在单词child中查找文档。使用命中

    实现多个单词搜索

答案 3 :(得分:1)

可以在Firebase上进行SQL“ LIKE”操作

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

答案 4 :(得分:-1)

此查询对我有用,看起来像下面的MySQL语句

select * from StoreAds where University Like %ps%;

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