使用数据列表进行Firebase搜索

使用数据列表进行Firebase搜索,firebase,firebase-realtime-database,Firebase,Firebase Realtime Database,假设我有一个要存储在Firebase实时数据库中的数据列表,并在以后进行搜索 存储和查询数据以获得最佳性能的最佳方法是什么 我的数据是一个名称列表(包含许多名称) [“鲍勃”,“罗伯”,…] 请注意,我有多个客户端在给定的时间内进行搜索。如果名称应该是唯一的,并且顺序无关紧要,那么您将希望将它们存储为一个数学集。在Firebase实时数据库中,您可以将其建模为: "usernames": { "Bob": true, "Rob": true } 关于此模型,请注意以下几点: 我们将这

假设我有一个要存储在Firebase实时数据库中的数据列表,并在以后进行搜索

存储和查询数据以获得最佳性能的最佳方法是什么

我的数据是一个名称列表(包含许多名称)

[“鲍勃”,“罗伯”,…]


请注意,我有多个客户端在给定的时间内进行搜索。

如果名称应该是唯一的,并且顺序无关紧要,那么您将希望将它们存储为一个数学集。在Firebase实时数据库中,您可以将其建模为:

"usernames": {
  "Bob": true,
  "Rob": true
}
关于此模型,请注意以下几点:

  • 我们将这些名称用作键,这意味着根据定义,每个名称都是唯一的(因为每个键在其包含节点中只能存在一次)
  • true
    值没有特定含义。它们只是需要的,因为Firebase无法存储没有值的密钥
  • 某些字符(如
    /
    )不能在键中使用。如果名称包含此类字符,则必须在键中筛选(或编码)。例如,名为
    Jes.sie
    的人必须存储为
    Jes.sie
    (有损)或例如
    Jes%2Esie
    (使用URL编码)
  • 在这种情况下,可以将原始的未过滤/未编码名称存储为值。所以:
    “Jes%2Esie”:“Jes.sie”
关于Firebase实时数据库中的(文本)搜索,请注意以下几点:

  • Firebase只能进行前缀匹配,它不支持搜索包含特定子字符串或以特定子字符串结尾的字符串。这意味着在原始数据中,它可以搜索以
    B
    开头的所有内容(使用
    orderByKey().startAt(“R”).endAt(“R\uF7FF”)
    ),但不能搜索以
    ob
    结尾的所有内容
  • 搜索区分大小写。如果您希望能够搜索不区分大小写的文件,请考虑将密钥存储为所有小写:

    "usernames": {
      "bob": "Bob",
      "rob": "Rob",
      "jes%2esie": "Jes.sie"
    }
    
  • >P>如果您需要更好地支持文本搜索,请考虑集成第三方搜索引擎。常见的建议是弹性搜索(自托管)或Algolia(基于云计算)

有关其中许多主题的详细信息,请参阅:

  • 这篇关于
  • 视频系列
  • (虽然为Firestore编写,但此处同样适用)

也许如果我有两个单词(或更多)的名称,有一种方法可以从第二个或第三个开始进行搜索?在我在此描述的解决方案中,每个名称只能出现一次。如果您选择了允许多次出现的不同数据模型(即,将名称存储在
name
属性中),则可以使用
orderByChild(“name”).startAt(“B”,“keyofobstatat”)
orderByValue().startAt(“B”,“keyofobstat”)
,其中,
keyofobostarat
是要返回的第一个匹配节点的键(必须以a
B
开头)。