使用 Parse 作为后端的快速最近邻搜索
Fast nearest neighbour search using Parse as backend
所以我必须在我的应用程序上实现最近邻搜索功能,我目前正在使用 Parse 作为后端。到目前为止,我所做的是执行查询并获取结果,然后对它们进行排序以获得前 20-30 个结果。但由于我的数据库已经扩大,我现在有大约 4,000 个位置(预计达到大约 15,000 个),我必须在这些位置上应用最近邻搜索。这对实时系统不利。
我想到的:
我可以使用 QuadTree 编写一个高效的解决方案,但这里有一个问题。我知道我可以做一份工作并创建四叉树并将其保存在内存中,但这似乎很浪费,因为总会有一个完整的线程专门用于维护内存中的树,更不用说不断的检查和平衡了。如果线程失败,我可能必须手动启动它。
另一个解决方案可能是创建一个 QuadTree 对象并将其存储在稳定的内存中,并在每次查询进入时读取该对象,并提供结果。但我认为这也会很慢。
我该如何解决这个问题?或者我应该尝试另一个 BaaS,还是使用 AWS 或 AppEngine 进行自定义 API?我真的不想在这一点上管理负载和安全功能的麻烦,因为这是一个非营利项目。
我会把这个工作留给 Parse,不需要手动搜索您的对象。获得 lat
和 lon
坐标后,只需创建 ParseGeoPoint
对象
ParseGeoPoint point = new ParseGeoPoint(lat, lon);
并使用此查询获取 30 个最近的对象
ParseQuery<ParseObject> query = ParseQuery.getQuery("YourClass");
query.whereNear("location", point);
query.setLimit(30);
query.findInBackground(new FindCallback<ParseObject>() { ... });
查询结果是ArrayList
从近到远排序的对象。
阅读 ParseGeoPoint
的 documentation 了解详细信息。
所以我必须在我的应用程序上实现最近邻搜索功能,我目前正在使用 Parse 作为后端。到目前为止,我所做的是执行查询并获取结果,然后对它们进行排序以获得前 20-30 个结果。但由于我的数据库已经扩大,我现在有大约 4,000 个位置(预计达到大约 15,000 个),我必须在这些位置上应用最近邻搜索。这对实时系统不利。
我想到的:
我可以使用 QuadTree 编写一个高效的解决方案,但这里有一个问题。我知道我可以做一份工作并创建四叉树并将其保存在内存中,但这似乎很浪费,因为总会有一个完整的线程专门用于维护内存中的树,更不用说不断的检查和平衡了。如果线程失败,我可能必须手动启动它。
另一个解决方案可能是创建一个 QuadTree 对象并将其存储在稳定的内存中,并在每次查询进入时读取该对象,并提供结果。但我认为这也会很慢。
我该如何解决这个问题?或者我应该尝试另一个 BaaS,还是使用 AWS 或 AppEngine 进行自定义 API?我真的不想在这一点上管理负载和安全功能的麻烦,因为这是一个非营利项目。
我会把这个工作留给 Parse,不需要手动搜索您的对象。获得 lat
和 lon
坐标后,只需创建 ParseGeoPoint
对象
ParseGeoPoint point = new ParseGeoPoint(lat, lon);
并使用此查询获取 30 个最近的对象
ParseQuery<ParseObject> query = ParseQuery.getQuery("YourClass");
query.whereNear("location", point);
query.setLimit(30);
query.findInBackground(new FindCallback<ParseObject>() { ... });
查询结果是ArrayList
从近到远排序的对象。
阅读 ParseGeoPoint
的 documentation 了解详细信息。