【问题标题】:Combining Firebase Queries with GeoQuery to search Posts by name in nearby area将 Firebase 查询与 GeoQuery 相结合,按名称搜索附近区域的帖子
【发布时间】: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,但必须便宜且负担得起)我可以选择在哪里实现预期的结果?

【问题讨论】:

    标签: android firebase firebase-realtime-database geofire


    【解决方案1】:

    Firebase 数据库只能通过单个属性进行查询。事实上,GeoFire 所做的事情似乎与此不一致(通过经度和纬度查询),因为它将这些值组合成一个名为 geohash 的神奇格式的单个属性(JSON 中的 g 属性)。

    将值组合到一个属性中是让 Firebase 过滤多个值的唯一方法。例如,您可以在 g 属性前加上您的书名以获得 some book name_geohashvalue,然后可以对其进行过滤。

    这样做的两个主要问题:

    1. 这仅在您知道整个书名的情况下才有效,您可以对书名进行前缀匹配,因为您已经需要对 geohash 使用前缀匹配。
    2. 这不是 GeoFire 内置的,因此您必须分叉该库并自己构建它。

    如果您确实尝试自己执行此操作并遇到困难,我们可以尝试提供帮助。但公平的警告:这不是微不足道的,您需要了解 geohashes、geofire 和 Firebase 的查询模型如何运作良好。对于介绍,我建议在 performing geoqueries on Firebase and Firestore 上观看我的演讲视频。

    如果您想要少一些参与,您有两个主要选择:

    1. 检索范围内的所有节点,然后在客户端过滤书名。
    2. 为每个书名存储一个单独的 GeoFire 树,以便您可以根据书名初始化 GeoFire 对象,并且只获取该特定书名范围内的键。

    在这两者之间,我建议从 #1 开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-06
      • 1970-01-01
      • 1970-01-01
      • 2013-09-27
      • 2021-12-31
      • 1970-01-01
      • 2022-12-01
      • 2017-06-09
      相关资源
      最近更新 更多