距离偏好为

时间:2017-05-10 10:52:32

标签: elasticsearch

对不起这个菜鸟问题...我在Elasticsearch 2.3中有餐厅对象,每个都有一个GeoPoint和一个送货上门距离偏好。在伪代码中

restaurant: {
  location: (x, y)
  deliveryPreference: 10km
}

和用户:

user {
  location: (a,b)
}

如何搜索寻找可以在其所在地区提供的所有餐馆的用户?

2 个答案:

答案 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_shapes。您需要按如下方式对餐馆文件进行建模:

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的餐馆。