我试图让所有用户都拥有包含来自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) 目前我的查询意味着,"give me all the users having name_ that starts with a given string"是否有办法让它成为"give me all the users which name contains a given string"? EDIT: NO
Firebase查询与全文搜索运算符没有任何相似之处 . 要实现这些目标,您要么必须集成外部全文搜索引擎,要么提出非常精细的自定义索引方案 . Firebase和索引/搜索
2) 目前我不想拥有服务器端代码,有什么可以成为实现自定义索引的有效方法?
谢谢
2 回答
好的 - 没有办法用你当前的结构做你想要的 .
然而,这只是突然出现在我脑海中:
这里有一些ObjC代码可以实现(并且经过测试!)
此代码返回Bob .
要获得所有'd'人,请将“components / b”更改为“components / d”
编辑:
您可以变得非常疯狂并添加更多组合以扩展您的搜索功能
编写几行代码来迭代名称并写出组合会非常简单 .
显然,如果只是将所有的名字读入快照,将它们转储到一个数组中,并且(在ObjC中)使用NSPredicate来提取你需要的东西,效率会更高(如果你有一个有限的数据集) .
oxyzen library in github 这样做,因为你使用一些包装的firebase进行插入和更新
对于索引部分基本上是函数:
JSON将文档字符串化 .
删除所有属性名称和JSON以仅删除数据(正则表达式) .
删除所有xml标记(因此也是html)和属性(记住旧指南,"data should not be in xml attributes"),如果存在xml或html,则只保留纯文本 .
删除所有特殊字符并用空格替换(正则表达式)
用一个空格替换多个空格的所有实例(正则表达式)
拆分为空格和周期:
为每个单词添加refs到你的数据库中的某个索引结构中的文件基本上包含以带有使用"ref/inthedatabase/dockey"的转义版命名的子项的单词命名的子项
然后
将文档作为普通的firebase应用程序插入
在oxyzen实现中,文档的后续更新ACTUALLY读取索引并更新它,删除不再匹配的单词,并添加新的单词 .
随后的单词搜索可以很容易地找到单词child中的文档 . 使用命中实现多个单词搜索