java - 如何在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得到另一个标题
(对不起,模糊和常见的问题标题,这只是我一直在寻找解决方案这么久)
解决方案
虽然代码有效,但它只返回与查询匹配的第一个值
这是预期的行为,因为 Firebase 实时数据库不支持本机索引或在数据库属性中搜索文本字段。
当您使用以下查询时:
fdb.orderByChild("title").startAt(searchquery).endAt(searchquery+"\uf8ff")
这意味着您正在尝试获取以 . 开头的所有元素searchquery
。例如,如果您有一个名为“Don Quixote”的标题并且您搜索“Don”,您的查询将返回正确的结果。但是,搜索“Quix”不会产生任何结果。
您可能会考虑下载整个节点以在客户端搜索字段,但这种解决方案根本不实用。要启用 Firebase 实时数据库数据的全文搜索,我建议您使用第三方搜索服务,例如Algolia或Elasticsearch。
如果您考虑在某个时间点尝试使用Cloud Firestore,请参阅以下示例:
要了解它如何与 Cloud Firestore 一起工作,但以相同的方式,您可以将它与 Firebase 实时数据库一起使用。
推荐阅读
- c++ - Failed to connect to a SMTP server
- python - python在lua中有类似于_ENV的东西吗?
- java - Android Caused by: java.lang.RuntimeException
- c# - How to mock a method returning IEnumerable
in unit test method? - javascript - 开玩笑,测试异步 JS 代码总是失败
- c# - 如何在 Xamarin Forms 中创建隐藏溢出
- c++ - Qt“函数/方法”中在堆栈上创建对象是如何工作的?
- .net - How to return message in the WCF endpoint?
- javascript - Angular - 在不同的父元素中动态添加组件
- networking - 入站流量,欺骗 IPv4 + 阻止真实 IPv4