我正在尝试使用 Bluemix 运行时中的 nano 库查询 cloudant 数据库。 目标是带回距离给定位置最近的 200 个地理点。我有一个使用虚拟数据设置的 cloudant 数据库和一个包含相关字段的搜索索引函数:
function(doc){
index("status", doc.status, {"store":true, index:true});
index("lat",doc.latitude,{"store": true, index:true});
index("lon",doc.longitude,{"store": true, index:true});
}
我可以直接查询cloudant数据库... https://my_cloudant_details/databasename/_design/mainDesignDoc/_search/search_location?q=status:1&limit=200&sort=%22%3Cdistance,lon,lat,5.0,50.0,km%3E%22 返回一个包含 200 个地点的列表,按距离中心 (5.0,50.0) 的远近排序。该数据库填充了一组 20000 个虚拟点,上面的搜索返回了距中心 3 到 60 公里之间的位置,因此一切看起来都不错。
我现在需要在 node.js bluemix 运行时中执行此操作。下面的函数被调用来在数据库上进行搜索...
app.get('/search', function(request, response) {
var latitude = request.query.latitude;
var longitude = request.query.longitude;
var qString = 'status:[1 TO 1]&limit=180&sort="<distance,lon,lat,' + longitude + ',' + latitude + ',km>"';
database.search('mainDesignDoc', 'search_location', {q:qString}, function(err, body) {
if (!err) {
var dbdata = [];
body.rows.forEach(function(doc) {
dbdata.push(doc.fields);
});
response.send(dbdata);
} else {
response.send("error: " + err);
}
});
});
这会返回 25 个结果,其中的点未排序,也不是距离中心最近的 25 个点。我尝试了 qString 的不同语法来尝试让它工作,但没有找到任何有效的东西。
任何帮助使其正常工作的帮助将不胜感激!!!
谢谢
最佳答案
代码似乎错误地将限制和排序参数指定为搜索查询 (q) 的一部分。我认为以下内容应该生成正确的 URL:
app.get('/search', function(request, response) {
var latitude = request.query.latitude;
var longitude = request.query.longitude;
var qString = 'status:[1 TO 1]';
var sortString = '"<distance,lon,lat,' + longitude + ',' + latitude + ',km>"';
database.search('mainDesignDoc', 'search_location', {q:qString, limit:180, sort:sortString}, function(err, body) {
if (!err) {
var dbdata = [];
body.rows.forEach(function(doc) {
dbdata.push(doc.fields);
});
response.send(dbdata);
} else {
response.send("error: " + err);
}
});
});
关于geo - Cloudant/Bluemix 地理搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28699027/