我的Firebase中有很多Telegram键盘,我希望有一个高级词典搜索Keyboards
的孩子,我的意思是在Secend Level Deep,用户输入的,<登记/>
例如,用户输入了rock
,我希望每个键盘都包含开始或中间或结束的摇滚,示例我有3个键盘:morning
,rock
和rocky
。
const ref = db.ref('Keyboards/rock'); //keyboard 1
const ref = db.ref('Keyboards/morning'); //keyboard 2
const ref = db.ref('Keyboards/rocky'); //keyboard 3
当用户输入console.log
时,如何获得rock
:rocky
和rock
?
我的问题90%由@rymdmaskin解决但是高级词典搜索仍然是开放的
equalTo
和startAt
以及endAt
不起作用,我需要contain
之类的东西,有人说使用弹性搜索(https://firebase.googleblog.com/2014/01/queries-part-2-advanced-searches-with.html)
规则:
{
"rules": {
".read": true,
".write": true,
"Keyboards" : {
".indexOn": "Keyboards"
}
}
}
代码:
const ref = db.ref('/');
ref.child('/').orderByChild('Keyboards').equalTo('rock').on("value", function(snapshot) {
console.log(snapshot.val());
key = snapshot.forEach(function(data) {
console.log(data.key);
});
});
答案 0 :(得分:3)
如果我做对了你就想做这样的事情。
结构:
- Keyboards
- 0
- name: "rocks"
- children
- 0: "id"
- 1: "desc"
- 1
- name: "rocky"
- children
- 0: "id"
- 1: "desc"
规则:
{
"rules": {
".read": true,
".write": true,
"Keyboards" : {
"$key": {
".indexOn": "name"
}
}
}
}
代码:
const ref = db.ref('/');
ref.child('Keyboards').orderByChild('name').equalTo('rocks').on("value", function(snapshot) {
console.log(snapshot.val());
key = snapshot.forEach(function(data) {
console.log(data.key);
});
});
这是你在找什么?
答案 1 :(得分:2)
我的建议是更改数据库上的结构或使用此查询似乎已解决问题:
.orderByKey().startAt("rock")
我不太确定它会适用于您未来的所有案例,因为我认为查询将从 rock 开始,但如果您有更多,则不会在 rock 结束 rocky 之后的键盘。我只是基于这个来源:Common SQL Queries converted for the Firebase Database
答案 2 :(得分:0)
Google目前进行全文搜索的方法似乎与Algolia或BigQuery for Fire Functions for Firebase同步。
用法(弹性搜索): (https://medium.com/joolsoftware/extending-firebase-with-cloud-functions-elasticsearch-129fbbb951e0)