首页 文章

在没有服务器端代码的Firebase中搜索

提问于
浏览
6

我试图让所有用户都拥有包含来自Firebase的给定字符串的名称 . 例如,如果我有这些用户:

Devid, Andy, Bob

我想让所有用户都拥有包含'D'的名称,所以我希望这样做:

Devid, Andy

这是我Firebase的结构:

enter image description here

由于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 回答

  • 11

    好的 - 没有办法用你当前的结构做你想要的 .

    然而,这只是突然出现在我脑海中:

    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);
    
    }];
    

    此代码返回Bob .

    要获得所有'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来提取你需要的东西,效率会更高(如果你有一个有限的数据集) .

  • 1

    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中的文档 . 使用命中实现多个单词搜索

相关问题