对不起这个菜鸟问题...我在Elasticsearch 2.3中有餐厅对象,每个都有一个GeoPoint和一个送货上门距离偏好。在伪代码中
restaurant: {
location: (x, y)
deliveryPreference: 10km
}
和用户:
user {
location: (a,b)
}
如何搜索寻找可以在其所在地区提供的所有餐馆的用户?
答案 0 :(得分:0)
使用以下映射索引约束文档
{
"mappings": {
"type_name": {
"properties": {
"name": {
"type": "text"
},
"location": {
"type": "text"
},
"location_geo": {
"type": "geo_point"
}
}
}
}
}
使用geo_filter查询
{
"query": {
"bool": {
"filter": {
"geo_distance": {
"distance": "10km",
"location_geo": {
"lat": 40,
"lon": -70
}
}
}
}
}
}
答案 1 :(得分:0)
解决方案涉及使用geo_shape
s。您需要按如下方式对餐馆文件进行建模:
PUT restaurants
{
"mappings": {
"restaurant": {
"properties": {
"name": {
"type": "text"
},
"location": {
"type": "geo_point"
},
"delivery_area": {
"type": "geo_shape",
"tree": "quadtree",
"precision": "1m"
}
}
}
}
}
然后,您可以按如下方式索引餐馆:
POST /restaurants/restaurant/1
{
"name": "My Food place",
"location": [-45.0, 45.0], <-- lon, lat !!!
"delivery_area": {
"type": "circle",
"coordinates" : [-45.0, 45.0], <-- lon, lat !!!
"radius" : "10km"
}
}
因此,每个餐厅将与以其位置为中心并具有适当半径的圆形相关联。
最后,当用户想要知道哪个餐馆可以在她当前所在的位置投放时,您可以发出以下geo_shape
query:
POST /restaurants/_search
{
"query":{
"bool": {
"filter": {
"geo_shape": {
"delivery_area": {
"shape": {
"type": "point",
"coordinates" : [<user_lon>, <user_lat>]
},
"relation": "contains"
}
}
}
}
}
}
在此查询中,我们检索的delivery_area
形状包含用户当前所在的point
的餐馆。