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

2024-02-01

我正在使用 firebase 进行数据存储。数据结构是这样的:

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

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

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

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

Thanks


更新:随着 Firebase Cloud Functions 的发布,还有另一种优雅的方法可以通过通过函数将 Firebase 连接到 Algolia https://github.com/firebase/functions-samples/tree/master/fulltext-search.这里的权衡是,Functions/Algolia 几乎是零维护,但与在 Node.js 中自行部署相比,成本可能会增加。

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

与此同时,当然也可以发展自己的业务。然而,搜索是一个广泛的主题(想想创建一个巨大的实时数据存储),被大大低估了,并且是应用程序的一个关键功能——您不想临时使用它,甚至不需要像 Firebase 这样的人来代表您提供。因此,采用可扩展的第三方工具来处理索引、搜索、标签/模式匹配、模糊逻辑、加权排名等通常更简单。

Firebase 博客的特色是关于使用 ElasticSearch 建立索引的博客文章 https://www.firebase.com/blog/2014-01-02-queries-part-two.html其中概述了一种将快速但功能极其强大的搜索引擎集成到 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>

这里有一个示例和一个用于简化集成的第三方库。 http://firebase.github.io/flashlight/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在firebase上执行sql“LIKE”操作? 的相关文章

  • 在 sinon.js 中存根和/或模拟类?

    我已经为我的应用程序创建了一个数据库包装器 如下所示 为了测试它 我显然想替换实际的数据库 我可以创建一个新类来模拟query方法并捕获那里的所有输入 但是使用sinon js看起来更合适 但是我该如何使用它呢 Is the mock or
  • 如何使用 jquery 在 ajax 调用中设置标头

    我需要从我自己的应用程序调用 Office 365 Rest API 当我在同一浏览器会话上复制并粘贴 url 时 我可以看到一些 XML 如果我将该 URL 粘贴到隐身窗口中 则会收到以下错误 The custom error modul
  • 如何使用 jQuery 添加/附加到外部 JSON 文件

    我有一个 json 文件 我想构建一个表单 允许我在文件中添加 编辑元素 是否有 jQuery 函数 方法允许我在外部 json 文件中发布和追加元素 不确定这是否有帮助 但当前的 json 结构如下 cast director genre
  • 将查询快照中的文档返回为 json 字符串 firestore

    我在节点到 firestore 中进行了查询以获取文档集合 我想将集合编写为 json 字符串以供应用程序解析 我的代码如下 serverRef db collection servers getDocs serverRef where o
  • Flutter Firestore 查询嵌套子集合

    我正在尝试查询 Firebase 中的子集合 但我总是得到一个空列表 这是我的查询 Firestore instance collection messages where idFrom isEqualTo userID snapshots
  • 如何使用 jQuery 在悬停元素旁边显示一个 div?

    假设我有severaldiv 像这样 EDIT div class ProfilePic a href img src lib css img profile pic1 png alt class ProfilePicImg a div c
  • 如何防止字段的角度自动修剪?

    有没有什么方法可以防止整个应用程序中字段的角度自动修剪 我知道我可以使用 ngTrim 指令防止指定字段出现这种情况 但将此指令添加到应用程序中的所有文本字段看起来不太好 有什么方法可以对 Angular 模块中的所有字段执行此操作吗 这是
  • IE9:奇怪的 JavaScript 错误

    我尝试在网站中显示 Google DFP 广告横幅时遇到错误 这些广告在除 IE9 之外的所有浏览器中展示 您可以在此处查看带有横幅的简单测试页面 离线演示 错误是 抛出异常但未捕获 google ads js 第 34 行字符 474 I
  • Javascript 搜索并替换包含方括号的字符序列

    我正在尝试在字符串 Nationality EN ESP 中搜索 EN 我想从字符串中删除它 所以我使用替换方法 代码示例如下 var str Nationality EN ESP var find EN var regex new Reg
  • 如何更改 angularjs $http.jsonp 的标头

    我读了document http docs angularjs org api ng 24http 但我想我一定是误解了 http defaults headers jsonp Accept application json http js
  • 在 JQueryUI 小部件的 QUnit 测试中测试可见性

    这对于其他人来说可能是显而易见的 但我没有通过搜索找到它 所以在这里发布问题和一个可能的答案 背景 使用自定义 JQuery UI 小部件小部件工厂 http jqueryui com widget 在小部件中 某些元素根据其他数据 选项隐
  • Mustache.js 只允许换行,转义其他 HTML

    我正在根据用户输入创建评论 并在用户单击 提交 后使用 Mustache js 渲染它们 我意识到我可以替换用户输入换行符 n with br 呈现为 HTML 中断 例如 myString replace n g br 我意识到我可以使用
  • 如何将多种语言设置放入单个 .clang-format 文件中

    我想为 java javascript 和 c 创建一个 clang 格式 我知道如何转储单一语言的示例配置 但不知道如何合并这 3 个配置文件 有关如何将多种语言配置放入单个文件中的示例 BasedOnStyle LLVM IndentW
  • 是否有跨浏览器的 jQuery contentEditable 库? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 jQuery 插件 库 它可以使 contentEditable 属性在所有主要浏览器中正常工作 我什至可以不用 IE6
  • 如何根据父网格的标题复选框选择/取消选择所有子复选框

    我正在开发一个 Web 应用程序 其中包含嵌套在另一个数据网格中的数据网格 在父网格中 我在标题模板中有一个复选框 在子网格中的项目模板中有另一个复选框 功能是 1 如果我单击父复选框 则应检查子网格中的所有项目 反之亦然 2 我的子网格中
  • Select2 触发器(“更改”)创建无限循环

    假设页面上有两个 select2 元素 都使用 onChange 为了以编程方式在一个 select2 元素中设置一个值 您可以使用 id1 val xyz trigger change 如果您在这两个元素之一中进行选择时想要将另一个元素重
  • 为什么事件属性不容易获取?

    我有以下代码 HERE https jsfiddle net 5n2zagjc 2 是可编辑的示例 用法 在输入字段中键入并观看控制台 function test event let keys Object keys event let k
  • 返回语句后的声明

    function f return f1 function f1 return 5 f returns 5 为什么这有效 之后声明局部函数有什么好处return 这是好的做法吗 它之所以有效 是因为函数声明都是由解释器在第一次传递时评估的
  • 未终止的字符串文字

    我有一个 php 脚本 可以在我的服务器上上传 mp3 文件 我使用 上传 有一个事件 onSelect 文档 http www uploadify com documentation events onselect 当文件上传时调用 使用
  • 访问 django for 循环中的元素

    我有一个 Django 模板 其中包含以下代码 该模板创建多个按钮并尝试通过单击 在同一按钮上 删除 隐藏其中一个按钮 for h in helicopters div class btn group div

随机推荐

  • 选择特定数字后的 n 行

    我使用这样的 data frame Country Date balance of payment business confidence indicator consumer confidence indicator CPI Crisis
  • 行、记录和元组有什么区别? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Java - 对于通用数据类型 Stack,new Stack[N] 是否等同于 new Stack[N]?

    Is new Stack 注意Stack 可以分配给Stack
  • 无法连接到远程 JMX

    我在远程主机上有一个 tomcat 应用程序 需要通过 JConsole 连接它 应用程序以参数开始 IP ifconfig eth0 grep inet addr cut d f2 cut d f1 Dcom sun management
  • ALSA中句号的含义

    我在 Linux 上使用 ALSA 和音频应用程序 我发现很棒的文档解释了如何使用它 1 http www linuxjournal com article 6735 page 0 1 and this one http users sus
  • gnuplot/ awk:为过滤后的数据绘制条形图

    我使用 gnuplot 结合 AWK 根据以下输入数据绘制 2D 条形图 Acceptor DonorH Donor Frames Frac AvgDist AvgAng lig 608 O3 HIE 163 HE2 HIE 163 NE2
  • Tensorflow 2.0 中 KerasLayer 的 TimeDistributed

    我正在尝试使用来自tensorflow hub的预训练模型构建CNN RNN base model hub KerasLayer https tfhub dev google imagenet resnet v2 50 feature ve
  • 如何使用Material-UI Grid进行SPA(负边距问题)

    我试图只使用Grid创建一个SPA 我已经习惯了material uiGrid并经常使用它 但是在我的新项目中我不确定我做错了什么 现在这就是问题所在 右侧有一个边距和一个水平滚动条 我知道负边距限制 但如果我对父元素应用填充 如文档所述
  • 如何以编程方式迭代 Word 文档中的下标、上标和方程

    我有一些 Word 文档 每个文档都包含数百页的科学数据 其中包括 化学式 H2SO4 具有所有正确的下标和上标 科学数字 使用上标格式化的指数 很多数学方程 使用Word 中的数学方程编辑器编写 问题是 以 Word 形式存储这些数据对我
  • Python从Json字符串中提取元素

    我有一个 Json 字符串 我可以从中提取一些组件 例如formatted address lat lng 但我无法提取其他组件的特征 值 例如交叉路口 政治 国家 行政区级别1 行政区级别2 行政区级别3 行政区级别4 行政区级别5 口语
  • 增量前和增量后的java评估

    你能一步步解释一下java是如何评估的吗 1 y 的值 int x 5 int y x x 2 这种情况下y的值 int x 5 int y x 3 x 好吧 操作数是从左到右计算的 并且在每种情况下都是 a 的结果postfix运算是递增
  • 转移 Github 组织所有权

    有一种方法可以转移github中存储库的所有权 但是有没有一种方法可以完全转移组织的所有权呢 Github 目前拥有一种向组织的所有者团队添加多人的方法 而且 最初创建组织的用户也可以将任何所有者从团队中删除 有没有办法删除该用户 并将完全
  • 在更新语句中使用表值函数

    我正在尝试执行以下更新语句 Update belege2 Set Preis Einh x Preis Aktion x Aktion PreisHerk x PreisHerk FROM dbo GetPreis belege2 prod
  • 属性选择器中有关空格的规则是什么?

    我正在阅读规范属性选择器 http www w3 org TR css3 selectors attribute selectors 但我找不到任何说明是否允许空格的内容 我猜它在开始 运算符之前和之后以及结束时是允许的 它是否正确 语法中
  • 无需单击 EditText 即可显示键盘

    我在 AlertDialog 上使用自定义布局 自定义布局有一个 EditText 文件 我用它来获取手机 当我显示 AlertDialog 时 为了让键盘输入电话号码 您必须单击 EditText 字段 有没有办法让键盘在我调出Alert
  • NPM 将依赖项安装在错误的位置

    我只是运行一个简单的npm install morgan在一个文件夹中 由于某种原因 它将所有子依赖项添加到父文件夹中 参见附图 是的 这是 npm 3 x 中的新功能 您可以在这里阅读 https github com npm npm r
  • 如何通过log4j控制日志文件的每日滚动和最大文件大小?

    我想创建可以在第二天开始时滚动的日志文件 或者如果达到指定的文件大小 并且日志文件必须包含在日期文件夹内 文件夹的格式是YYYYMMDD 20111103 mylogfile log 是否可以通过 Log4j 来做到这一点而不实现自定义类
  • 如何从gitlab存储中完全删除大文件

    I had a project rar文件大小为 350 MB 不幸的是我提交了它并将其推送到远程gitlab 现在gitlab存储空间为500 MB 如何从 gitlab 存储中删除该文件 我尝试过这些 git filter branch
  • Chrome 禁用网站的 SSL 检查? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我因将非 https 网站作为 https 访问而收到此警告 尝试通过将该命令添加到快捷方式目标来禁用它 但它不起作用 C Program
  • 如何在firebase上执行sql“LIKE”操作?

    我正在使用 firebase 进行数据存储 数据结构是这样的 products product1 name chocolate product2 name chochocho 我想对此数据执行自动完成操作 通常我会这样编写查询 select