Cloudant似乎几乎可以检查我们为我们的应用寻找的所有内容,但是从它上面玩了一下,我确实有一个设计障碍。
我们的应用需要拉近附近的X最近用户。我注意到在Cloudant中直接和一般搜索都可以使用地理查询。但是,我们希望保护我们的用户'位置,因此想要一种查询距离点的距离,但返回的结果没有附加地理数据。
我一直在寻找一种方法来整合"减少"在geoindex之上过滤掉敏感数据但似乎不存在。
我也知道我们可以创建一个处理查询的服务器并在返回客户端之前删除地理数据,但是Cloudant最大的吸引力之一是它的离线优先从应用程序端同步到DB。
一些基于位置的教程涉及使用Envoy来划分用户数据(https://developer.ibm.com/clouddataservices/2016/06/14/location-tracker-part-1-offline-first/)。这似乎是我们想要的方向,但它仍然不完全正确,因为用户仍然根本没有彼此接触,而我们希望除了地理数据之外的所有内容都可以跨用户使用。
您是否有关于如何使用Cloudant进行此操作的建议?
答案 0 :(得分:8)
要执行此操作,请勿使用Cloudant Geo进行地理空间查询,请使用Cloudant Search,它还具有一些地理空间查询功能。您不能按多边形查询,但可以将非空间搜索与地理位置相结合。它将允许您查询数据的属性,并按距离点对结果进行排序。在定义索引时,DO索引地理空间字段,但不要将它们返回给客户端(通过在索引中指定"store":"false"
)。我在这里有一篇博文:https://developer.ibm.com/clouddataservices/2016/01/07/geospatial-query-with-cloudant-search/
这是使用https://opendata.cloudant.com/crimetest
数据库的一些代码。
查看crimetest
中的一些文档:
https://opendata.cloudant.com/crimetest/_all_docs?limit=3&include_docs=true
定义Cloudant搜索索引:在Cloudant仪表板中,添加一个新的搜索索引:
function (doc) {
if (doc.properties.source && doc.properties.timestamp && doc.geometry.coordinates) {
index("description", doc.properties.desc, {"store":true});
index("timestamp", doc.properties.timestamp, {"store":true});
index("lat", doc.geometry.coordinates[1], {"store":false});
index("lon", doc.geometry.coordinates[0], {"store":false});
}
}
https://opendata.cloudant.com/crimetest/_design/geosearch/_search/spatial?q=*:*&sort=%22%3Cdistance,lon,lat,-90.127519,29.953602,mi%3E%22
您将根据距离-90.127519,29.953602的距离对所有文档(q=*:*
)进行排序。在响应中将有一个订单字段,其中第一个元素是距离点的距离(以英里为单位)(查询中的mi
,而不是km
)