将 Firebase 查询与 GeoQuery 相结合,按名称搜索附近区域的帖子
Posted
技术标签:
【中文标题】将 Firebase 查询与 GeoQuery 相结合,按名称搜索附近区域的帖子【英文标题】:Combining Firebase Queries with GeoQuery to search Posts by name in nearby area 【发布时间】:2020-05-10 02:22:06 【问题描述】:我正在制作一个安卓应用程序,用户可以在其中找到他/她附近的一本书,如果有兴趣可以购买。我正在使用 firebase 和 geoqueries/geofire。 我想创建一个 SearchActivity,用户可以在其中通过书名在他/她附近搜索一本书。
我的 Firebase 数据库结构如下所示:
books
PushKey
g:
l:
0:
1:
name:"some book name"
如果我尝试用一些书名来查询它,它可以正常使用:
myRef.orderByChild("name").equalTo("some book name").addChildEventListener()....//The rest of the code here...
如果我尝试查询附近的书籍,那么它也可以正常使用:
geoQuery = geoFire.queryAtLocation(myLocation, 10);
我坚持将这两者结合起来。 如何仅在附近搜索特定的书名? 例如:我想搜索一本名为“ABCD”且半径为 10 公里的书。 要么 按名称搜索一本书并告诉哪一本是最近的(如果在不同位置上传了多本同名的书)。 有可能这样做吗?如果没有,我可以选择什么解决方法(可能不是 firebase,但必须便宜且负担得起)我可以选择在哪里实现预期的结果?
【问题讨论】:
【参考方案1】:Firebase 数据库只能通过单个属性进行查询。事实上,GeoFire 所做的事情似乎与此不一致(通过经度和纬度查询),因为它将这些值组合成一个名为 geohash 的神奇格式的单个属性(JSON 中的 g
属性)。
将值组合到一个属性中是让 Firebase 过滤多个值的唯一方法。例如,您可以在 g
属性前加上您的书名以获得 some book name_geohashvalue
,然后可以对其进行过滤。
这样做的两个主要问题:
-
这仅在您知道整个书名的情况下才有效,您可以对书名进行前缀匹配,因为您已经需要对 geohash 使用前缀匹配。
这不是 GeoFire 内置的,因此您必须分叉该库并自己构建它。
如果您确实尝试自己执行此操作并遇到困难,我们可以尝试提供帮助。但公平的警告:这不是微不足道的,您需要了解 geohashes、geofire 和 Firebase 的查询模型如何运作良好。对于介绍,我建议在 performing geoqueries on Firebase and Firestore 上观看我的演讲视频。
如果您想要少一些参与,您有两个主要选择:
-
检索范围内的所有节点,然后在客户端过滤书名。
为每个书名存储一个单独的 GeoFire 树,以便您可以根据书名初始化 GeoFire 对象,并且只获取该特定书名范围内的键。
在这两者之间,我建议从 #1 开始。
【讨论】:
以上是关于将 Firebase 查询与 GeoQuery 相结合,按名称搜索附近区域的帖子的主要内容,如果未能解决你的问题,请参考以下文章
Firebase / GeoQuery - 最大半径 IF 语句