在没有服务器端代码的情况下在 Firebase 中搜索
Searching in Firebase without server side code
我正在尝试从 Firebase 获取名称包含给定字符串的所有用户。
例如,如果我有这些用户:
Devid, Andy, Bob
我想让所有用户的名字都包含 'D',所以我希望这样的结果:
Devid, Andy
这是我目前的 Firebase 结构:
由于 Firebase 区分大小写,我创建了一个包含小写名称的属性 name_
。
使用 startAt 和 endAt 我可以获得名称以定义的字符串开头的所有用户
ref.orderByChild("name_").startAt(text).endAt(text+"\uf8ff").on('value', ...);
但这只给我名称以给定字符串开头的用户,例如,如果文本是 'D' 我会得到:
Devid
1) 目前我的查询意思是“给我所有具有以给定字符串开头的 name_ 的用户”有没有办法让它的意思是“给我名称包含给定字符串的所有用户”?
编辑:否
Firebase Queries don't have anything similar to full-text search
operators. To accomplish those, you'll either have to integrate an
external full-text search engine, or come up with a very elaborate
custom indexing scheme. Firebase and indexing/search
2)目前我不想有服务器端代码,什么是实现自定义索引的有效方法?
谢谢
好的 - 目前的结构无法完全满足您的要求。
然而这只是突然出现在我的脑海中:
users:
user_1234
first_name: "Devid"
components:
"D": true
"e": true
"v": true
"i": true
"d": true
user_5678
first_name: "Andy"
components:
"A": true
"n": true
"d": true
"y": true
user_1010
first_name: "Bob"
components:
"B": true
"o": true
"b": true
这里有一些实现它的 ObjC 代码(并且已经过测试!)
Firebase *ref = [myRootRef childByAppendingPath:@"users"];
FQuery *q1 = [ref queryOrderedByChild:@"components/b"];
FQuery *q2 = [q1 queryEqualToValue:@1];
[q2 observeEventType:FEventTypeChildAdded withBlock:^(FDataSnapshot *snapshot) {
NSLog(@"%@", snapshot.value);
}];
此代码returns鲍勃
要获取所有 'd' 人,请将 "components/b" 更改为 "components/d"
编辑:
您可以变得非常疯狂并添加更多组合来扩展您的搜索能力
users:
user_1234
first_name: "Devid"
components:
"D": true
"e": true
"v": true
"i": true
"d": true
"De": true
"Dev": true
"Devi": true
"Devid": true
"ev": true
"evi": true
"evid": true
... etc
编写几行代码来遍历名称并写出组合会非常简单。
显然(如果你的数据集有限)将所有名字读入快照,将它们转储到数组中并(在 ObjC 中)使用 NSPredicate 来提取你想要的东西会更有效需要。
github 中的 oxyzen 库就是这样做的
假设您使用一些包装的 firebase
进行插入和更新
索引部分的基本功能是:
- JSON 将文档字符串化。
- 删除所有 属性 名称和
JSON 仅保留数据(正则表达式)。
- 删除所有 xml 标签(因此也 html)和属性(记住旧指南,"data should not be in xml attributes")只留下纯文本,如果 xml 或 html 在场。
- 删除所有特殊字符并替换为 space(正则表达式)
- 将多个 space 的所有实例替换为一个 space(正则表达式)
- 拆分为 space 秒和循环:
- for each word adds refs to the document in some index structure in your db that basically contains childs named with words with childs named with a escaped version of "ref/inthedatabase/dockey"
为每个单词在你的数据库中的某个索引结构中添加对文档的引用
- 然后像普通的 firebase 应用程序一样插入文档
在 oxyzen 实现中,文档的后续更新实际上读取索引并更新它,删除不再匹配的词,并添加新词。
后续搜索词可以很容易的找到文档中的词子。
使用 hits
实现多词搜索
我正在尝试从 Firebase 获取名称包含给定字符串的所有用户。 例如,如果我有这些用户:
Devid, Andy, Bob
我想让所有用户的名字都包含 'D',所以我希望这样的结果:
Devid, Andy
这是我目前的 Firebase 结构:
由于 Firebase 区分大小写,我创建了一个包含小写名称的属性 name_
。
使用 startAt 和 endAt 我可以获得名称以定义的字符串开头的所有用户
ref.orderByChild("name_").startAt(text).endAt(text+"\uf8ff").on('value', ...);
但这只给我名称以给定字符串开头的用户,例如,如果文本是 'D' 我会得到:
Devid
1) 目前我的查询意思是“给我所有具有以给定字符串开头的 name_ 的用户”有没有办法让它的意思是“给我名称包含给定字符串的所有用户”? 编辑:否
Firebase Queries don't have anything similar to full-text search operators. To accomplish those, you'll either have to integrate an external full-text search engine, or come up with a very elaborate custom indexing scheme. Firebase and indexing/search
2)目前我不想有服务器端代码,什么是实现自定义索引的有效方法?
谢谢
好的 - 目前的结构无法完全满足您的要求。
然而这只是突然出现在我的脑海中:
users:
user_1234
first_name: "Devid"
components:
"D": true
"e": true
"v": true
"i": true
"d": true
user_5678
first_name: "Andy"
components:
"A": true
"n": true
"d": true
"y": true
user_1010
first_name: "Bob"
components:
"B": true
"o": true
"b": true
这里有一些实现它的 ObjC 代码(并且已经过测试!)
Firebase *ref = [myRootRef childByAppendingPath:@"users"];
FQuery *q1 = [ref queryOrderedByChild:@"components/b"];
FQuery *q2 = [q1 queryEqualToValue:@1];
[q2 observeEventType:FEventTypeChildAdded withBlock:^(FDataSnapshot *snapshot) {
NSLog(@"%@", snapshot.value);
}];
此代码returns鲍勃
要获取所有 'd' 人,请将 "components/b" 更改为 "components/d"
编辑:
您可以变得非常疯狂并添加更多组合来扩展您的搜索能力
users:
user_1234
first_name: "Devid"
components:
"D": true
"e": true
"v": true
"i": true
"d": true
"De": true
"Dev": true
"Devi": true
"Devid": true
"ev": true
"evi": true
"evid": true
... etc
编写几行代码来遍历名称并写出组合会非常简单。
显然(如果你的数据集有限)将所有名字读入快照,将它们转储到数组中并(在 ObjC 中)使用 NSPredicate 来提取你想要的东西会更有效需要。
github 中的 oxyzen 库就是这样做的 假设您使用一些包装的 firebase
进行插入和更新索引部分的基本功能是:
- JSON 将文档字符串化。
- 删除所有 属性 名称和 JSON 仅保留数据(正则表达式)。
- 删除所有 xml 标签(因此也 html)和属性(记住旧指南,"data should not be in xml attributes")只留下纯文本,如果 xml 或 html 在场。
- 删除所有特殊字符并替换为 space(正则表达式)
- 将多个 space 的所有实例替换为一个 space(正则表达式)
- 拆分为 space 秒和循环:
- for each word adds refs to the document in some index structure in your db that basically contains childs named with words with childs named with a escaped version of "ref/inthedatabase/dockey" 为每个单词在你的数据库中的某个索引结构中添加对文档的引用
- 然后像普通的 firebase 应用程序一样插入文档
在 oxyzen 实现中,文档的后续更新实际上读取索引并更新它,删除不再匹配的词,并添加新词。
后续搜索词可以很容易的找到文档中的词子。 使用 hits
实现多词搜索