将 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 语句

带有recyclerview的双打印地理查询

geoQuery不输出数据怎么办?

使用 Geoquery 解析查询

如何将我的用户的支出与他们在 Firebase 中的个人资料相关联?

将 Android Room 数据库与 Firebase 实时数据库相关联