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

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

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

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

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

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

谢谢

4个解决方案
26 votes

更新:随着针对Firebase的Cloud Functions的发布,还有另一种优雅的方式可以做到这一点,即通过Functions将Firebase链接到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('<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>

这里有一个例子,还有一个第三方库来简化集成。

Kato answered 2020-08-12T03:48:10Z
12 votes

我相信你可以做到:

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

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

资源

Ced answered 2020-08-12T03:48:40Z
2 votes

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

let node = await db.ref('yourPath').orderByChild('yourKey').startAt('!').endAt('SUBSTRING\uf8ff').once('value');
Mili Shah answered 2020-08-12T03:49:00Z
1 votes

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

虽然我喜欢并建议弹性搜索项目的成熟度,但无需其他服务器,也可以仅使用firebase数据库完成相同的工作。那就是我的意思:([https://github.com/metaschema/oxyzen)]

对于索引部分基本上的功能是:

  1. JSON将文档字符串化。
  2. 删除所有属性名称和JSON,仅保留数据(正则表达式)。
  3. 删除所有xml标签(因此也删除html)和属性(记住旧指南,“数据不应位于xml属性中”)仅保留如果存在xml或html,则为纯文本。
  4. 删除所有特殊字符并用空格代替(正则表达式)
  5. 用一个空格替换多个空格的所有实例(正则表达式)
  6. 拆分为空格和循环:
  7. 为每个单词在文档的某些索引结构中添加引用您的数据库通常包含以childs命名的childs以“ ref / inthedatabase / dockey”的转义版本命名
  8. 然后像普通的Firebase应用程序那样插入文档

在oxyzen实现中,文档的后续更新实际上会读取索引并对其进行更新,删除不再匹配的单词,然后添加新的单词。

随后的单词搜索可以直接在child单词中找到文档。 使用匹配功能实现多个单词搜索

user3191409 answered 2020-08-12T03:50:15Z
translate from https://stackoverflow.com:/questions/22506531/how-to-perform-sql-like-operation-on-firebase