Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用firebase提高经纬度数据搜索效率的方法?_Firebase_Search_Firebase Realtime Database - Fatal编程技术网

使用firebase提高经纬度数据搜索效率的方法?

使用firebase提高经纬度数据搜索效率的方法?,firebase,search,firebase-realtime-database,Firebase,Search,Firebase Realtime Database,我在firebase中有一个名为users的表,该表如下所示: 该表的结构如下: users |_ uid1 |_ latitude: ... longitude: ... name: ... uid2 |_ latitude: ... longitude: ... name: ... 我想编写一个名为getUserByLocation的云函数,示例请求url为http

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

该表的结构如下:

users
  |_
    uid1
     |_
       latitude: ...
       longitude: ...
       name: ...
    uid2
     |_
       latitude: ...
       longitude: ...
       name: ...
我想编写一个名为
getUserByLocation
的云函数,示例请求url为
https://someurl/getUserByLocation?latitude=40.45654&longitude=-86.68468
,以一对
纬度
经度
为原点,然后转到
users
表查找10英里内的所有用户,然后将其返回。这看起来并不难,事实上,我有一些有效的方法:

  • 计算
    latLower
    latUpper
    longLower
    longUpper
    ,然后像这样画一个圆圈:
  • 然后使用查询<代码>…OrthByCube(“纬度”).STATAT(LATALER).EntAt(LutoLoad)。一旦(“值”)…<代码>选择用户的<代码>纬度<代码>在范围内,此时我不能考虑<代码>经度< /代码>,因为显然我只能用一个键< /LI>排序结果。
  • 我检查从步骤2中选择的所有结果,如果
    经度
    也在范围内(介于
    longLower
    longUpper
    之间),则应返回此用户
  • 这种方法确实有效,但是,我在想,如果有数百万用户呢?这种方法就是没有效率。事实上,我编写了一个脚本来创建超过100万个用户,然后使用这种方法来选择用户,通常需要10秒以上的时间才能看到结果,这是不可接受的

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

    你可以使用,但你必须将坐标存储在一个单独的根节点中,供用户使用。类似于
    用户位置
    ,其中每个子项都是由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 };
        });
    });
    

    不管是谁投了我一票。。。。有什么原因吗?我不在乎声誉,但否决票会让这个问题被更少的人看到,至少让我知道它有什么问题?拜托,这是一个结构合理的问题你听说过GeoFire吗@Callam不,我没有,我会先看一看,如果我对此有疑问,我会发布在这个网站上。但如果最终这是解决我问题的可行方案,我会让你知道的,谢谢!我试过了,但我认为我不能在云计算功能中使用它。我不认为在客户端使用它是一个好主意,我正在编写一个移动设备应用程序,所以它将expensive@K.Wu我已经实现了一个搜索引擎,它使用GeoFire来查询一个位置,然后通过请求每个孩子来分别过滤密钥。您可以通过请求和筛选批次的子项来对结果进行分页。在云函数中使用GeoFire有什么困难?