elasticsearch 中geo point地理位置數據類型


第一個例子

建立映射

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"       //排序,這個比較消耗性能,請謹慎使用
      }
    }
  }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM