无需服务器端代码即可在 Firebase 中搜索

2024-03-19

我正在尝试获取名称包含 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_ 的用户”,有没有办法让它意味着“给我所有名称包含给定字符串的用户”?EDIT: NO

Firebase 查询没有类似于全文搜索的功能 运营商。为了实现这些,您要么必须集成一个 外部全文搜索引擎,或者想出一个非常详尽的 自定义索引方案。Firebase 和索引/搜索 https://stackoverflow.com/questions/10559191/firebase-and-indexing-search

2)目前我不想使用服务器端代码,什么是实现自定义索引的良好且有效的方法?

Thanks


好的 - 目前的结构无法完全满足您的要求。

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

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”

Edit:

您可以变得非常疯狂并添加更​​多组合来扩展您的搜索能力

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 提取您需要的内容会更有效(如果您的数据集有限)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无需服务器端代码即可在 Firebase 中搜索 的相关文章

随机推荐