在没有服务器端代码的情况下在 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

进行插入和更新

索引部分的基本功能是:

  1. JSON 将文档字符串化。
  2. 删除所有 属性 名称和 JSON 仅保留数据(正则表达式)。
  3. 删除所有 xml 标签(因此也 html)和属性(记住旧指南,"data should not be in xml attributes")只留下纯文本,如果 xml 或 html 在场。
  4. 删除所有特殊字符并替换为 space(正则表达式)
  5. 将多个 space 的所有实例替换为一个 space(正则表达式)
  6. 拆分为 space 秒和循环:
  7. 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"
  8. 为每个单词在你的数据库中的某个索引结构中添加对文档的引用
  9. 然后像普通的 firebase 应用程序一样插入文档

在 oxyzen 实现中,文档的后续更新实际上读取索引并更新它,删除不再匹配的词,并添加新词。

后续搜索词可以很容易的找到文档中的词子。 使用 hits

实现多词搜索