第一個例子
建立映射
PUT /my_index
{
"mappings": {
"my_type": {
"properties": {
"location" : {
"type": "geo_point" //地理位置的分詞器是geo_point
}
}
}
}
}
填充數據
PUT my_index/my_type/1
{
"text": "Geo-point as an object",
"location": {
"lat": 41.12, //latitude :緯度的縮寫
"lon": -71.34 //longitude : 經度的縮寫
}
}
根據地理位置進行查詢
GET /my_index/my_type/_search
{
"query": {
"geo_bounding_box": {
"location": {
"top_left" : {
"lat" : 42,
"lon" : -72
},
"bottom_right" : {
"lat" : 40,
"lon" : -74
}
}
}
}
}
//有一點很奇怪,經緯度和坐標系有點不一樣
第二個例子
酒店O2O
//建立索引
PUT /hotel_app
{
"mappings": {
"hotels" : {
"properties": {
"bin" : {
"properties": {
"location" : {
"type" : "geo_point"
}
}
}
}
}
}
}
//填充數據
PUT /hotel_app/hotels/1
{
"name": "喜來登大酒店",
"pin" : {
"location" : {
"lat" : 40.12,
"lon" : -71.34
}
}
}
//搜索(兩點矩形)
GET /hotel_app/hotels/_search
{
"query": {
"bool": {
"must": [
{"match_all": {}}
],
"filter": {
"geo_bounding_box": {
"pin.location": {
"top_left" : {
"lat" : 40.73,
"lon" : -74.1
},
"bottom_right" : {
"lat" : 40.01,
"lon" : -71.12
}
}
}
}
}
}
}
//搜索(多點,多邊形)
GET /hotel_app/hotels/_search
{
"query": {
"bool": {
"must": [
{"match_all": {}}
],
"filter": {
"geo_polygon": {
"pin.location": {
"points": [
{"lat" : 40.73, "lon" : -74.1},
{"lat" : 40.01, "lon" : -71.12},
{"lat" : 50.56, "lon" : -90.58}
]
}
}
}
}
}
}
//搜索(根據距當前位置的距離)
GET /hotel_app/hotels/_search
{
"query": {
"bool": {
"must": [
{"match_all": {}}
],
"filter": {
"geo_distance": {
"distance": "1000km",
"pin.location": {
"lat": 40,
"lon": -74
}
}
}
}
}
}
//聚合分析,(距離當前位置一定范圍內有多少個酒店)
GET /hotel_app/hotels/_search
{
"size": 0,
"aggs": {
"count_by_distinct": {
"geo_distance": {
"field": "pin.location", //要分析的點
"origin": { //當前位置經緯度
"lat": 40,
"lon": 70
},
"ranges": [ //范圍控制
{"to" : 100},
{
"from": 100,
"to": 300
},
{"from": 300}
],
"unit": "mi", //單位
"distance_type": "arc" //排序,這個比較消耗性能,請謹慎使用
}
}
}
}