【问题标题】:Use firebase realtime database create search function使用firebase实时数据库创建搜索功能
【发布时间】:2018-04-10 23:13:57
【问题描述】:

我想使用 firebase 实时数据库为我的应用创建搜索功能,类似于 facebook 搜索。

我做了一些研究并承认 firebase 实时无法使用“文本包含”进行搜索。但我相信必须有一些方法来实现它,比如结合 startAt 或 endAt。

我需要一些建议来做这件事的最佳实践。

数据库结构如下所示:

Restaurant
-->RandomID
---->name: 'Good Restaurant'
---->address:
---->desc:
-->RandomID
---->name: 'Dixon Lee Restaurant'
---->address:
---->desc:
-->RandomID
---->name: 'MCD'
---->address:
---->desc:

已编辑 我不确定 startAt 和 endAt 是如何工作的。如果我使用 startAt(3) 是否应该返回 3 及以上?如果我将 startAt 与字符串一起使用会怎样?像下面的问题我ecnounter:

firebase.database().ref('/restaurants').orderByChild('name').startAt('Good').on('value',snap=>{
      console.log(snap.val())
    })

上述查询将返回:

我正在考虑使用 startAt/endAt 实现“文本包含”,它将找到以关键字开头/结尾的字段的特定值。不确定这是 startAt/endAt 的用法。

【问题讨论】:

  • 既然您已经找到了有关它的答案,您认为哪些具体是可能的,以及它如何与其他答案相匹配?否则,我不确定要回答什么,或者它与现有的答案(非常丰富)有何不同。
  • @FrankvanPuffelen 感谢您一直回复 Firebase 问题。我对 startAt 和 endAt 的使用有疑问,文档不够清晰,无法指导像我这样的菜鸟。我已经用我遇到的问题更新了帖子。

标签: firebase firebase-realtime-database angularfire


【解决方案1】:

您似乎将startAt 与一个接受以 开头的字符串的函数混淆了。这根本不是 Firebase 过滤的工作原理。

当您执行ref('/restaurants').orderByChild('name').startAt('Good') 时,它会做三件事:

  1. restaurants 的所有子节点按其name 值排序。
  2. 查找以 Good 开头的第一个(或按字典顺序在 Good 之后的任何内容)
  3. 从那里返回每个孩子

因此,您将获得名称为 Good RestaurantMCD 的子节点。

您可以使用startAtendAt 返回子节点的范围,即所有以 Good 开头的子节点。为此,您需要创建一个从 Good 开始到 Good\uF8FF 结束的范围:

ref('/restaurants').orderByChild('name').startAt('Good').endAt('Good\uF7FF')

由于 \uF8FF 是最后一个已知的 Unicode 字符,因此此查询返回以例如开头的项目。 GoodGoodieGoodness,但不是Gooey(因为GooeGood\uF7FF之后)。

【讨论】:

  • 感谢您的解释,我不确定我是否理解,我也不确定如何进一步询问... orderByChild('name') 将根据“name”属性从 A 到Z 和 startAt('Good') 将返回“G”之后的所有餐厅(作为对象)?如果我有“Fun”、“Happy”、“Better”、“Crazy”和“Inspire”餐厅,它会返回 Fun, Happy, Inspire Restaurant 给我吗?此外,我不明白 endAt 是如何工作的以及 \uF8FF 是什么意思。我用谷歌搜索了它,他们说是“最后一个”,但我不确定它如何与 endAt 一起工作
  • 如果您按字母顺序订购“Fun”、“Happy”、“Better”、“Crazy”和“Inspire”,您将获得“Better”、“Crazy”、“Fun”、“Happy”、 “启发”。如果你然后从“好”开始(所以放弃“好”之前的所有内容)你会得到“快乐”和“激励”。如果你从“好”开始,到“空心”结束,你只会得到“快乐”。
  • 假设我按字母顺序订购“Fun Restaurant”、“Happy Cafe”、“Better Restaurant”、“Crazy cafe”、“Good Restaurant”和“Inspire Coffee Shop”,我会得到“Better Restaurant” ”、“疯狂咖啡厅”、“欢乐餐厅”、“好餐厅”、“快乐咖啡厅”和“灵感咖啡店”对吧?如何通过查询“餐厅”得到“更好的餐厅”、“有趣的餐厅”和“好餐厅”?或通过查询 Coffee 或 Shop 获取“Inspire Coffee Shop”?这甚至可能吗?还是firestore能够实现它?再次感谢!
  • 这是对子字符串的查询,这在 Firebase 数据库查询中是不可能的。见stackoverflow.com/questions/28589092/…
【解决方案2】:

要使用 Firebase 进行全文搜索,最好使用 Algolia,正如 Firebase 官方文档中 full-text search 页面中所推荐的那样。这是一个易于理解的实时数据库教程:

Firebase Algolia Tutorial

如果您的记录少于 10k,则可以免费使用。

【讨论】:

    猜你喜欢
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    相关资源
    最近更新 更多