我正在研究搜索功能,用户可以搜索某个餐馆。场景是:
我正在收集餐馆,其中我有多个位置及其纬度和经度信息。 现在在搜索期间,
我有用户的位置信息(纬度和经度)。因此,我必须根据最近到最远的用户位置对餐厅进行排序,并且必须对使用文本索引编制索引的字段的内容进行文本搜索。
我有不同的搜索方案,所以我使用聚合管道和投影来评分结果。 有人可以建议我从哪里开始吗?
提前致谢。
答案 0 :(得分:1)
尝试以下步骤:
<强>步骤1:强>
在架构中添加位置字段,并在其上创建2dsphere索引。
location: { type: [Number], index: '2dsphere' }
您还可以动态创建索引:
db.collection.createIndex( { <location field> : "2dsphere" } )
<强>第二步强>
现在使用$ geoNear:
创建聚合查询var aggregateQuery = [{
"$geoNear": {
"near": {
"type": "Point",
"coordinates": [options.longitude, options.latitude]
},
"distanceField": 'dis',
"distanceMultiplier": .001,
"spherical": true,
"query": **conditions**
}
}];
您可以在查询参数中传递任何条件。
db.collectionname.aggregate(aggregateQuery).exec(function(err, result){
// use result here
})
注意:请记住先将经度存储在位置数组中,然后再存储纬度。
有关详细信息,请参阅此链接: https://docs.mongodb.com/manual/reference/command/geoNear/
希望这会有所帮助!!
<强>更新强>:
db.collectionname.aggregate([
{$match: {
$text: {$search: "text"} ,
location: {$geoWithin: {$centerSphere: [[ longitude, latitude], points]}}
}}])
注意:不会使用地理索引!
有关详细信息,请参阅此链接http://docs.mongodb.org/manual/reference/operator/query/geoWithin/