根据距离在Firebase中搜索

时间:2016-06-11 03:50:19

标签: android firebase firebase-realtime-database

我正在将使用Mysql的应用程序迁移到firebase,我设法几乎全部迁移它,只是错过了搜索的部分,我不太明白它是如何工作的。我正在尝试在firebase中执行以下查询。

SELECT *, (6371 * acos( cos(radians(?)) * cos(radians(latitude)) * cos(radians(?) - radians(longitude)) + sin(radians(?)) * sin(radians(latitude)) )) AS distance FROM usuario ORDER BY distance

enter image description here

我要做的是将我的用户的纬度和经度传递给firebase,然后他将所有订购的用户退回给最近的用户。

注意:这与我在我的应用程序中使用的查询不同,我只是在google上找到并且不知道这是否有效,但您可以了解我正在尝试做什么。 注意²:英语不是我的母语:P

3 个答案:

答案 0 :(得分:4)

您提供的示例SQL查询使用Firebase中不存在的SQL功能:使用表中每行的列值计算表达式的能力,然后使用该表达式的值对该表达式进行过滤和排序查询结果。

我没有看到使用Firebase执行所需查询类型的方法。

您可能需要查看Geofire library。我没有使用它,它的功能似乎与接近过滤有关,而不是你需要的远程排序功能,但也许你可以调整你的需求来使用它的功能。

答案 1 :(得分:3)

我同意Qbix并且通常会将其作为评论发布,但我想确保Geohash评论不会在小文字随机播放中丢失。

GeoFire使用Geohash代码创建其密钥并允许范围匹配。对于基本的应用程序,这可能没问题,但是第二个你超越美国这会产生很多麻烦,因为它在赤道和Prime Meridian(英国)周围不能很好地工作。有关详细信息,请参阅Wikipedia Page on Geohash,具体为:Edge case locations close to each other but on opposite sides of the 180 degree meridian will result in Geohash codes with no common prefix (different longitudes for near physical locations).

Firebase是一款令人惊叹的产品,但不是一种万能的工具。如果您需要良好的基于​​地理位置的搜索/匹配,请使用ElasticSearch,MySQL,Algolia等工具直接支持它。在这种情况下减少组件数量并不会降低复杂性,而是增加了它。

答案 2 :(得分:0)

您可以使用Geofirestore库 https://github.com/geofirestore/geofirestore-js

这是使用的示例:

import * as firebase from 'firebase/app';
import 'firebase/firestore';
import { GeoCollectionReference, GeoFirestore, GeoQuery, GeoQuerySnapshot } from 'geofirestore';

// Initialize the Firebase SDK
firebase.initializeApp({
  // ...
});

// Create a Firestore reference
const firestore = firebase.firestore();

// Create a GeoFirestore reference
const geofirestore: GeoFirestore = new GeoFirestore(firestore);

// Create a GeoCollection reference
const geocollection: GeoCollectionReference = geofirestore.collection('restaurants');

// Create a GeoQuery based on a location
const query: GeoQuery = geocollection.near({ center: new firebase.firestore.GeoPoint(40.7589, -73.9851), radius: 1000 });

// Get query (as Promise)
query.get().then((value: GeoQuerySnapshot) => {
  console.log(value.docs); // All docs returned by GeoQuery
});

其中查询中的{1000}是位置搜索的半径