在前面的文章中,筆者介紹過,Elasticsearch是可以支持空間類型存儲的,採用的數據類型為geo_point和geo_shape,索引方式主要為geohash。筆者在前面的文章中也介紹了geohash的基本原理。那麼,對於空間類型的數據,很常用的一種場景,就是檢索某個區域內的空間要素,比如,檢索出海澱區所有的銀行網點有哪些。
以上述場景為因子,筆者今天來講一下Elasticsearch所支持的Bbox查詢。所謂Bbox,其實就是通過兩個點確定的一個矩形框,一般採用左上加右下角(或者左下右上)的座標來唯一確定一個矩形框。
![5分鐘掌握Elasticsearch的BBox查詢](http://p2.ttnews.xyz/loading.gif)
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查詢](http://p2.ttnews.xyz/loading.gif)
4 Bbox定點設置
可以通過top_left和bottom_right或者top_right和bottom_left參數設置邊界框的定點。也支持駝峰的命名:topLeft,bottomRight或topRight,bottomLeft。除了承兌設置值之外,還可以分別用簡稱top,left,bottom和right分別設置值。
5 filter的type設置
默認情況下,Bbox的執行類型設置為memory,即默認是在內存中檢查文檔是在bbox範圍內的。在某些情況下,type的值設置為indexed,索引速度會更快一些。不過,如果設置type=indexed,geo_point類型必須對經緯度做了索引。
歡迎關注筆者,每天分享架構乾貨。
關鍵字: 前面 筆者 Elasticsearch