使用firebase实时数据库创建搜索功能

时间:2018-04-10 23:13:58

标签: firebase firebase-realtime-database angularfire

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

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

我需要一些建议去做最好的练习。

DB结构如下所示:

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与字符串一起使用怎么办?就像下面的问题我一样:

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

以上查询将返回: enter image description here

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

2 个答案:

答案 0 :(得分:3)

您似乎将startAt混淆了一个函数,该函数接受以开始某个值的字符串。这根本不是Firebase过滤的工作方式。

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

  1. restaurants值上对name的所有子节点进行排序。
  2. 找到以Good开头的第一个(或Good之后的任何词典编排方式)
  3. 从那里返回每个孩子
  4. 因此,您将获得名为Good RestaurantMCD的子节点。

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

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

    由于\uF8FF是最后一个已知的Unicode字符,因此该查询返回以例如GoodGoodieGoodness,但不是Gooey(因为Gooe位于Good\uF7FF之后)。

答案 1 :(得分:0)

对于Firebase的全文本搜索,您最好使用Algolia,如官方Firebase文档的full-text search页中所建议的那样。这是一个易于理解的实时数据库教程:

Firebase Algolia Tutorial

如果记录少于1万条,则可以免费使用。