【问题标题】:Ways to improve search efficiency of data at longitude and latitude with firebase? [duplicate]使用firebase提高经纬度数据搜索效率的方法? [复制]
【发布时间】:2018-06-29 23:00:50
【问题描述】:

我在 firebase 中有一个名为 users 的表,该表如下所示:

这个表的结构是:

users
  |_
    uid1
     |_
       latitude: ...
       longitude: ...
       name: ...
    uid2
     |_
       latitude: ...
       longitude: ...
       name: ...

我想写一个名为getUserByLocation的云函数,示例请求url为https://someurl/getUserByLocation?latitude=40.45654&longitude=-86.68468,它以latitude和longitude一对为原点,然后转到users表找到 10 英里内的所有用户,然后将其返回。这似乎并不难,事实上,我有一些工作:

  1. 计算latLower、latUpper、longLower和longUpper,然后画一个这样的圆圈:
  2. 然后使用查询...orderByChild('latitude').startAt(latLower).endAt(latUpper).once('value')... 选择latitudes 在范围内的用户,此时我不能考虑longitude,因为显然我只能通过一键排序结果
  3. 我检查从步骤 2 中选择的所有结果,如果 longitude 也在范围内(在 longLower 和 longUpper 之间),那么应该返回这个用户

这种方法确实有效,但是,我在想,如果有数百万用户怎么办?这种方法只是效率不高。事实上,我写了一个脚本,创建了超过 100 万用户,然后用这种方法来选择用户,通常需要 10 多秒才能看到结果,这是不可接受的。

我的问题是,在这种情况下有什么办法可以提高搜索效率?我用谷歌搜索了ElasticSearch,但目前不知道那是什么,在这种情况下,它可以用来改进搜索吗?

【问题讨论】:

  • 谁给了我反对票...。有什么理由吗?我不在乎名誉,但是投票会让这个问题被更少的人看到,至少让我知道它有什么问题?来吧,这是一个结构良好的问题
  • @Callam 不,我没有,我会先阅读它,如果我对此有任何疑问,我会在这个网站上发布。但如果最终这对我的问题来说是一个可行的解决方案,我会告诉你的,谢谢!

标签: firebase search firebase-realtime-database


【解决方案1】:

您可以使用GeoFire 执行此操作,但您必须将坐标存储在单独的根节点中以供用户使用。类似于user-location,其中每个孩子都是由 GeoFire 管理的用户密钥和位置。您可以使用它更有效地查询某个位置的半径并检索范围内用户的 ID - 但是,您必须获取找到的每个用户 ID 的用户数据。

const geofire = require('geofire');
const geoFire = new geofire(admin.database().ref('user-location'));
const geoQuery = geoFire.query({ center, radius });

let keyListener = null;
let keyLocations = {};

return new Promise((res, rej) => {
    geoQuery.on('ready', function () {
        console.log(keyLocations);
        keyListener.cancel();
        geoQuery.cancel();
        res();
    });
    keyListener = geoQuery.on('key_entered', (key, coordinates, distance) => {
        keyLocations[key] = { coordinates, distance };
    });
});

【讨论】:

  • 我试过了,但我认为我不能在 Cloud Function 中使用它。我不认为在客户端使用它是一个好主意,我正在编写一个移动设备应用程序,所以它会很昂贵
  • @K.Wu 我已经实现了一个搜索引擎,它使用 GeoFire 来查询位置,然后通过请求每个孩子单独过滤密钥。您可以通过请求和过滤成批的子项来对结果进行分页。您在 Cloud Functions 中使用 GeoFire 有哪些困难?
猜你喜欢
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 2019-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-24
  • 2014-09-15
相关资源
最近更新 更多