geo型別的字段是不能使用動態對映自動生成的,我們需要在建立索引時指定欄位的型別為geo_point
,geo_point
型別的字段儲存的經緯度,我們看看經緯度是怎麼定義的,
英文簡寫
正數負數
維度latitude
lat北緯
南緯經度
longitude
lon或lng
東經西經
經度的簡寫有2個,一般常用的是lon,lng則在第三方地圖的開放平台中使用比較多。下面我們先建立乙個帶有geo_point
型別欄位的索引,如下:
put /my_geo}}
},"dynamic_date_formats":[
"mm/dd/yyyy",
"yyyy/mm/dd hh:mm:ss",
"yyyy-mm-dd",
"yyyy-mm-dd hh:mm:ss"
],"properties":}}
}
建立了乙個my_geo索引,在索引中有一些基礎的配置,預設ik分詞器,動態對映的時間格式。重點是最後我們新增了乙個欄位location,它的型別是geo_point
。
索引建立完了,我們新增兩條資料吧,假設,路人甲在北京站,路人乙在朝陽公園。那麼我們怎麼「北京站」和「朝陽公園」的經緯度呢?我們在做專案時,前端都會接地圖控制項,經緯度的資訊可以呼叫地圖控制項的api獲取。在咱們的示例中,也不接地圖控制項了,太麻煩了,直接在網上找到「北京站」和「朝陽公園」的座標吧。
我們查到「北京站」的座標如下:
然後新增一條資料:
post /my_geo/_doc
}
再查「朝陽公園」的座標
再新增「路人乙」的資訊
post /my_geo/_doc
}
我們再用elasticsearch-head
外掛程式看一下索引中的資料:
「路人甲」和「路人乙」的資訊都有了,但是沒有location
欄位的資訊,因為location
是特性型別的字段,在這裡是展示不出來的。我們搜尋一下吧,看看怎麼用geo搜尋,假設「我」的位置在「工體」,我們先要查到「工體」的座標,
然後再查詢5km範圍內都有誰,傳送請求如下:
post /my_geo/_search}}}}}
在查詢的時候用的是filter
查詢,再filter查詢裡再使用geo_distance
查詢,我們定義距離distance
為5km,再指定geo型別的字段location
,當前的座標為:39.93031708627304n,116.4470385453491e。查詢一下,看看結果:
}},}}]}
看來,我們站在「工體」,「北京站」的路人甲和「朝陽公園」的路人乙都在5km的範圍內。把範圍縮短一點如何,改為3km看看,搜尋的請求不變,只是把distance
改為3km,看看結果吧,
}}]
}
只有在「朝陽公園」的路人乙被搜尋了出來。完全符合預期,我們再看看程式中怎麼使用geo搜尋。
在定義實體類時,對應的geo欄位要使用特殊的型別,如下:
@setter@getter
public class mygeo
location的型別是geopoint
,新增資料的方法沒有變化,轉化成json就可以了。再看看查詢怎麼用,
public void searchgeo() throws ioexception
}
執行一下,看看結果,
}
只有在「朝陽公園」的路人乙被查詢了出來,符合預期。
有的小夥伴可能會有這樣的疑問,我不想按照距離去查詢,只想把查詢結果按照離「我」的距離排序,該怎麼做呢?再看一下,
public void searchgeosort() throws ioexception
}
這次查詢並沒有設定查詢條件,而是建立了乙個geo距離排序,同樣,先指定geo欄位location
,和當前的座標工體,再設定排序是公升序。執行一下,看看結果,
}
}
ES7 學習筆記
es7只有2個特性 他是乙個替代indexof 開發人員用來檢查某個字在陣列中是否存在的。indexof 驗證陣列中是否存在某個元素,這時需要根據返回值是否為 1來判斷。includes 驗證陣列中是否存在某個元素,這樣更加直觀簡單,直接返回 true 或 false。let arr react a...
ES7特性總結
不知道小夥伴們es6的特性學的怎麼樣了?es2016 es7 和es2017 es8 都已經要出來了,本文為大家整理介紹一下es7的新特性。es7特性只有兩個 array.prototype.includes value 任意值 boolean includes 方法用來判斷乙個陣列是否包含乙個指定...
es7查詢總結
put nba create 1 put nba doc 2 put nba doc 3 put nba doc 4 put nba doc 5 put nba doc 6 put nba doc 7 查詢英文名稱為 golden state warriors 的球隊資訊 get nba searc...