慕課網(wǎng) 20200330 es+geo+baidu-map 直播視頻與文字版筆記
時間:2023-06-07 12:18:02 | 來源:網(wǎng)站運營
時間:2023-06-07 12:18:02 來源:網(wǎng)站運營
慕課網(wǎng) 20200330 es+geo+baidu-map 直播視頻與文字版筆記:視頻版本
視頻已經(jīng)由慕課網(wǎng)上傳至B站,免費高清,地址為:https://www.bilibili.com/video/BV1Lz411b7cN。以下都是文字版筆記。
《Elasticsearch極速入門與基于百度地圖的geo地理位置搜索》
1. es介紹
互動
:什么是搜索:
- 百度谷歌,都是搜索引擎。
- 垂直搜索,站內(nèi),比如淘寶京東站內(nèi)搜索商品。
- 什么是ES:
Elasticsearch 是一個分布式可擴展的實時搜索和分析引擎,底層基于lucene。
- 可以存儲文檔,用于海量數(shù)據(jù)檢索
- 可以近實時的分析數(shù)據(jù)
- 可擴展性(幾百個節(jié)點甚至上千)相當強大。
- 結(jié)合ELK,實現(xiàn)日志收集
(架構(gòu)師課程里有)
- 地理位置geo信息搜索與監(jiān)控和分析(常用于社交平臺,物流快遞,地圖等場景)
可以互動
:為什么要使用es
如果用普通數(shù)據(jù)庫,單表可以存多少數(shù)據(jù)比較合適?這個主要看自己自身業(yè)務(wù),一般來說,1000萬左右,但是6-700萬的樣子就可以開始逐步計劃做數(shù)據(jù)庫優(yōu)化分庫分表等
。普通搜索基于數(shù)據(jù)庫,數(shù)據(jù)庫單表存儲能力有限,數(shù)據(jù)量越多,搜索性能越低下- 數(shù)據(jù)庫支持模糊搜索,全表掃描遍歷(es基于倒排索引,根據(jù)詞匯直接把對應(yīng)的文檔id搜索到然后把對應(yīng)的數(shù)據(jù)查詢出來),不支持高亮搜索
- 我在慕課網(wǎng)這個網(wǎng)站搜索
spring 短視頻
- 詞條:spring 短視頻
- 數(shù)據(jù)庫不支持分詞搜索,es(搜索引擎)支持
- db搜索不如專業(yè)的搜索引擎靠譜
簡單聊一聊倒排索引
2. es的核心術(shù)語與數(shù)據(jù)結(jié)構(gòu)
- 核心術(shù)語
- ES --> 數(shù)據(jù)庫(1)
- 索引index --> 表(2)
- 文檔 document --> 行(記錄)(3)
- 字段 fields --> 列(4)
- 類型type 過期,也能作為表
- 數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)庫表記錄,對應(yīng)es:
文檔的數(shù)據(jù)如何體現(xiàn),或者說是怎樣的數(shù)據(jù)格式?
stu_index: [ stu_doc: { id: 1001, name: jack, age: 19 }, { id: 1002, name: lucy, age: 18 }, { id: 1003, name: lily, age: 17 }, { id: 1004, name: lilei, age: 20 } ]
3. es和head插件安裝見慕課網(wǎng)手記
https://github.com/mobz/elasticsearch-head#running-with-built-in-server https://www.imooc.com/article/286936 這個基于centos6,架構(gòu)師課程基于centos7
4. head插件,索引index創(chuàng)建與映射mappings創(chuàng)建
索引名: friends
分片與集群,健康度
*簡稱(附)
shard = primary shard(主分片)
replica = replica shard(副本分片)
演示使用head來進行索引的創(chuàng)建
- 主分片(shard):把索引庫拆分為多份,分別放在不同的節(jié)點上,比如有3個節(jié)點,3個節(jié)點的所有數(shù)據(jù)內(nèi)容加在一起是一個完整的索引庫。分別保存到三個節(jié)點上,目的為了水平擴展,提高吞吐量。也可以做到故障轉(zhuǎn)移。ES自動管理和組織分片, 并在必要的時候?qū)Ψ制瑪?shù)據(jù)進行再平衡分配, 所以用戶基本上無需擔心分片的相關(guān)處理細節(jié)
- 副本分片(replica):每個shard的備份。也可以稱之為副本,ES默認為一個索引創(chuàng)建5個主分片, 并分別為其創(chuàng)建一個副本分片。意思就是說每個索引都由5個主分片(shard)形成,而每個主分片都相應(yīng)的有一個備份(replica)。
- 分片機制
每個索引可以被分片,就相當于吃披薩的時候被切了好幾塊,然后分給不同的人吃,如下圖所示:
- 索引my_doc只有一個主分片;
- 索引shop有3個主分片;
- 索引shop2有5個主分片。
- 每個主分片都包含索引的數(shù)據(jù),由于目前是單機,所以副本分片是沒有的,這個時候集群健康值顯示為黃色。
- 副本分片是主分片的備份,主掛了,備份還是可以訪問,這就需要用到集群了。
- 同一個分片的主與副本是不會放在同一個服務(wù)器里的,因為一旦宕機,這個分片就沒了
- 我不知道大家有沒有玩過nas,這個數(shù)據(jù)存儲有點像raid機制。
es 健康度
不同的顏色表示es不同的健康程度
- 綠色:集群健康,所有主分片和副本分片都是可用狀態(tài)。
- 黃色:亞健康,所有的主分片可用,但是副本分片部分不可用。
- 紅色:不健康,主分片部分不可用。
ES - GEO地理位置
0. 必學(xué)英文單詞
- longitude: [?l??ɡ?tju?d] 經(jīng)度
- latitude: [?l?t?tu?d] 緯度
- 通過經(jīng)緯度可以定位在地球上的某一個點
1. 拾取坐標
那么接下來我們可以通過地圖來拾取一些坐標,當然如果是在app上,用戶在進行搜索的時候,是會通過手機來獲得當前的坐標點,通過這個坐標點來進行相關(guān)的搜索業(yè)務(wù)的。
- http://api.map.baidu.com/lbsapi/getpoint/index.html
- http://www.jq22.com/yanshi18814
- 注意:每個地圖的坐標都是不同的,百度,谷歌,高德等自家的坐標系都是獨立的。哪怕通過物理設(shè)備在室外拿到的坐標,也是需要根據(jù)一定的規(guī)范進行坐標轉(zhuǎn)換才能針對不同的地圖去使用。
- http://lbsyun.baidu.com/ 百度地圖api
- http://lbsyun.baidu.com/cms/jsapi/reference/jsapi_reference.html 核心類參考
- 慕課網(wǎng)的文章參考:https://www.imooc.com/article/72571
2. 使用postman創(chuàng)建mappings映射
- userId: 用戶id
- userName: 用戶名
- geo: 用戶上一次出現(xiàn)的位置
- place: 位置名稱
POST /friends/_mapping (es6為/friends/_doc/_mapping) { "properties": { "userId": { "type": "long" }, "userName": { "type": "text" }, "geo": { "type": "geo_point" }, "place": { "type": "text" } } }
3. 插入geo數(shù)據(jù)
POST /friends/_doc/{useId} # 杭州夫子廟 { "userId": 1001, "userName": "Iron Man", "geo": { "lon": 118.795263, "lat": 32.02705 }, "place": "杭州夫子廟" } # 杭州書店 { "userId": 1002, "userName": "Thor", "geo": { "lon": 118.795708, "lat": 32.027092 }, "place": "杭州書店" } # 鹽水鴨 { "userId": 1003, "userName": "Steve", "geo": { "lon": 118.796134, "lat": 32.027861 }, "place": "鹽水鴨" } # 雞鳴寺 { "userId": 1004, "userName": "SpiderMan", "geo": { "lon": 118.801893, "lat": 32.067251 }, "place": "雞鳴寺" } # 杭州古生物博物館 { "userId": 1005, "userName": "BlackWidow", "geo": { "lon": 118.801592, "lat": 32.065931 }, "place": "杭州古生物博物館" } # 雞鳴山莊 { "userId": 1006, "userName": "Hawkeye", "geo": { "lon": 118.798659, "lat": 32.068096 }, "place": "雞鳴山莊" } # 北極閣公園 { "userId": 1007, "userName": "Hulk", "geo": { "lon": 118.797105, "lat": 32.066134 }, "place": "北極閣公園" } # 杭州大學(xué) { "userId": 1008, "userName": "Magneto", "geo": { "lon": 118.797105, "lat": 32.066134 }, "place": "杭州大學(xué)" } # 杭州郵電大學(xué) { "userId": 1009, "userName": "GreenArrow", "geo": { "lon": 118.936814, "lat": 32.121167 }, "place": "杭州郵電大學(xué)" } # 杭州師范大學(xué) { "userId": 1010, "userName": "BatMan", "geo": { "lon": 118.916549, "lat": 32.111014 }, "place": "杭州師范大學(xué)" }
4. 刪除文檔
DELETE /friends/_doc/{id}
5. 修改文檔
- 局部:
POST /my_doc/_doc/1/_update {
"doc": {
"name": "慕課"
}
} - 全量替換:
PUT /my_doc/_doc/1 {
"id": 1001,
"name": "imooc-1",
"desc": "imooc is very good, 慕課網(wǎng)非常牛!",
"create_date": "2019-12-24"
}
6. 以矩陣的形式查詢范圍內(nèi)的坐標
以
左上
和
右下
為基準所畫的矩陣中,只要包含geo坐標點,就會被查詢出來
- 左上:lon 118.789703,lat 32.030249
- 右下:lon 118.802171,lat 32.024341
GET /friends/_doc/_search { "query": { "geo_bounding_box": { "geo": { "top_left": { "lon": 118.789703, "lat": 32.030249 }, "bottom_right": { "lon": 118.802171, "lat": 32.024341 } } } } }
7. 自定義區(qū)域搜索
使用場景:大氣環(huán)境監(jiān)測,國控的,激光雷達設(shè)備所組成的一個范圍
GET /friends/_doc/_search { "query": { "geo_polygon": { "geo": { "points": [ {"lon": 118.798533, "lat": 32.029269}, {"lon": 118.797221, "lat": 32.028427}, {"lon": 118.792748, "lat": 32.02555}, {"lon": 118.799449, "lat": 32.025634} ] } } } }
8. 從當前位置搜索一定范圍內(nèi)的朋友
互動
:使用場景最多,比如:
- 微信搖一搖搜好友
- 探探app左滑右滑匹配好友
- 抖音顯示同城附近好友所拍的短視頻
- 攜程app搜索附近酒店
- 大眾點評搜索附近飯店
- 搜索附近空閑的共享單車
- 出租車叫車服務(wù),查看車子到哪里了
- 物流app找車找貨
GET /friends/_doc/_search { "query": { "geo_distance": { "distance": "50m/1km/10km", "geo": { "lon": 118.795739, "lat": 32.026973 } } } }
9. 搜索區(qū)間范圍內(nèi)的好友個數(shù)
常用于主動的推薦:
- 比如主動推薦說在一定范文內(nèi)有多少個朋友你可能認識
- 比如主動推薦一定距離范文內(nèi)有多少車源或者貨源
用于統(tǒng)計距離某個點位置100米,500米,2公里范圍內(nèi)的坐標數(shù)量。
單位:一般用km或m
GET /friends/_doc/_search { "size": 0, "aggs": { "tongji": { "geo_distance": { "distance_type": "plane", "field": "geo", "origin": { "lon": 118.79549, "lat": 32.027042 }, "unit": "km", "ranges": [ { "from": 0, "to": 1 }, { "from": 1, "to": 5 }, { "from": 5, "to": 100 } ] } } } }
http://weixin.qq.com/r/rjrk-KXELfhSreGf92_8 (二維碼自動識別)