我想使用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())
})
我正在考虑使用startAt / endAt实现“text contains”,它将找到以关键字开头/结尾的字段的特定值。不确定这是startAt / endAt的用法。
答案 0 :(得分:3)
您似乎将startAt
混淆了一个函数,该函数接受以开始某个值的字符串。这根本不是Firebase过滤的工作方式。
执行ref('/restaurants').orderByChild('name').startAt('Good')
时,它会做三件事:
restaurants
值上对name
的所有子节点进行排序。Good
开头的第一个(或Good
之后的任何词典编排方式)因此,您将获得名为Good Restaurant
和MCD
的子节点。
您可以使用startAt
和endAt
返回范围的子节点,即所有以 Good
开头的子节点。为此,您需要创建一个从Good
开始到Good\uF8FF
结束的范围:
ref('/restaurants').orderByChild('name').startAt('Good').endAt('Good\uF7FF')
由于\uF8FF
是最后一个已知的Unicode字符,因此该查询返回以例如Good
,Goodie
,Goodness
,但不是Gooey
(因为Gooe
位于Good\uF7FF
之后)。
答案 1 :(得分:0)
对于Firebase的全文本搜索,您最好使用Algolia,如官方Firebase文档的full-text search页中所建议的那样。这是一个易于理解的实时数据库教程:
如果记录少于1万条,则可以免费使用。