首页 > 解决方案 > 如何在firebase数据库中搜索

问题描述

我正在尝试使用以下代码过滤数据库中的数据:

fdb.orderByChild("title").startAt(searchquery).endAt(searchquery+"\uf8ff").addValueEventListener(valuelistener2);

我的数据库是这样的:

  "g12" : {
    "Books" : {
      "-Mi_He4vHXOuKHNL7yeU" : {
        "title" : "Technical Sciences P1"
      },
      "-Mi_He50tUPTN9XDiVow" : {
        "title" : "Life Sciences"
      },
      "-Mi_He51dhQfl3RAjysQ" : {
        "title" : "Technical Sciences P2"
      }}

虽然代码有效,但它只返回与查询匹配的第一个值,即使匹配也不会获取其余数据。

如果我将“T”作为搜索查询,我只会得到第一个标题“Technical Sciences P1 ”,而不会用P2得到另一个标题

(对不起,模糊和常见的问题标题,这只是我一直在寻找解决方案这么久)

标签: javaandroidfirebasefirebase-realtime-databasegoogle-cloud-platform

解决方案


虽然代码有效,但它只返回与查询匹配的第一个值

这是预期的行为,因为 Firebase 实时数据库不支持本机索引或在数据库属性中搜索文本字段。

当您使用以下查询时:

fdb.orderByChild("title").startAt(searchquery).endAt(searchquery+"\uf8ff")

这意味着您正在尝试获取以 . 开头的所有元素searchquery。例如,如果您有一个名为“Don Quixote”的标题并且您搜索“Don”,您的查询将返回正确的结果。但是,搜索“Quix”不会产生任何结果。

您可能会考虑下载整个节点以在客户端搜索字段,但这种解决方案根本不实用。要启用 Firebase 实时数据库数据的全文搜索,我建议您使用第三方搜索服务,例如AlgoliaElasticsearch

如果您考虑在某个时间点尝试使用Cloud Firestore,请参阅以下示例:

要了解它如何与 Cloud Firestore 一起工作,但以相同的方式,您可以将它与 Firebase 实时数据库一起使用。


推荐阅读