5分鐘掌握Elasticsearch的BBox查詢

在前面的文章中,筆者介紹過,Elasticsearch是可以支持空間類型存儲的,採用的數據類型為geo_point和geo_shape,索引方式主要為geohash。筆者在前面的文章中也介紹了geohash的基本原理。那麼,對於空間類型的數據,很常用的一種場景,就是檢索某個區域內的空間要素,比如,檢索出海澱區所有的銀行網點有哪些。

以上述場景為因子,筆者今天來講一下Elasticsearch所支持的Bbox查詢。所謂Bbox,其實就是通過兩個點確定的一個矩形框,一般採用左上加右下角(或者左下右上)的座標來唯一確定一個矩形框。

5分鐘掌握Elasticsearch的BBox查詢

1 準備索引和數據

PUT /my_locations
{
 "mappings": {
 "properties": {
 "pin": {
 "properties": {
 "location": {
 "type": "geo_point"
 }
 }
 }
 }
 }
}
// 插入銀行網點座標
PUT /my_locations/_doc/1
{
 "pin" : {
 "location" : {
 "lat" : 40.12,
 "lon" : -71.34
 }
 }
}

2 實戰查詢query

可以採用geo_bouding_box過濾器來進行檢索

GET my_locations/_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
 }
 }
 }
 }
 }
 }
}

3 支持多種座標點格式

構造查詢時,Bbox的左上和右下角座標的格式可以作為屬性輸入,也可以採用數組的形式,還可以採用String格式,當然,也支持標準的WKT格式。由於Elasticsearch本身採用geohash索引,查詢也支持geohash輸入。

5分鐘掌握Elasticsearch的BBox查詢

4 Bbox定點設置

可以通過top_left和bottom_right或者top_right和bottom_left參數設置邊界框的定點。也支持駝峰的命名:topLeft,bottomRight或topRight,bottomLeft。除了承兌設置值之外,還可以分別用簡稱top,left,bottom和right分別設置值。

5分鐘掌握Elasticsearch的BBox查詢

5 filter的type設置

默認情況下,Bbox的執行類型設置為memory,即默認是在內存中檢查文檔是在bbox範圍內的。在某些情況下,type的值設置為indexed,索引速度會更快一些。不過,如果設置type=indexed,geo_point類型必須對經緯度做了索引。

5分鐘掌握Elasticsearch的BBox查詢

歡迎關注筆者,每天分享架構乾貨。


分享到:


相關文章: