慕课网 20200330 es+geo+baidu-map 直播视频与文字版笔记
时间:2023-06-07 12:18:02 | 来源:网站运营
时间:2023-06-07 12:18:02 来源:网站运营
慕课网 20200330 es+geo+baidu-map 直播视频与文字版笔记:视频版本
视频已经由慕课网上传至B站,免费高清,地址为:https://www.bilibili.com/video/BV1Lz411b7cN。以下都是文字版笔记。
《Elasticsearch极速入门与基于百度地图的geo地理位置搜索》
1. es介绍
互动
:什么是搜索:
- 百度谷歌,都是搜索引擎。
- 垂直搜索,站内,比如淘宝京东站内搜索商品。
- 什么是ES:
Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,底层基于lucene。
- 可以存储文档,用于海量数据检索
- 可以近实时的分析数据
- 可扩展性(几百个节点甚至上千)相当强大。
- 结合ELK,实现日志收集
(架构师课程里有)
- 地理位置geo信息搜索与监控和分析(常用于社交平台,物流快递,地图等场景)
可以互动
:为什么要使用es
如果用普通数据库,单表可以存多少数据比较合适?这个主要看自己自身业务,一般来说,1000万左右,但是6-700万的样子就可以开始逐步计划做数据库优化分库分表等
。普通搜索基于数据库,数据库单表存储能力有限,数据量越多,搜索性能越低下- 数据库支持模糊搜索,全表扫描遍历(es基于倒排索引,根据词汇直接把对应的文档id搜索到然后把对应的数据查询出来),不支持高亮搜索
- 我在慕课网这个网站搜索
spring 短视频
- 词条:spring 短视频
- 数据库不支持分词搜索,es(搜索引擎)支持
- db搜索不如专业的搜索引擎靠谱
简单聊一聊倒排索引
2. es的核心术语与数据结构
- 核心术语
- ES --> 数据库(1)
- 索引index --> 表(2)
- 文档 document --> 行(记录)(3)
- 字段 fields --> 列(4)
- 类型type 过期,也能作为表
文档的数据如何体现,或者说是怎样的数据格式?
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插件安装见慕课网手记
https://github.com/mobz/elasticsearch-head#running-with-built-in-server https://www.imooc.com/article/286936 这个基于centos6,架构师课程基于centos7
4. head插件,索引index创建与映射mappings创建
索引名: friends
分片与集群,健康度
*简称(附)
shard = primary shard(主分片)
replica = replica shard(副本分片)
演示使用head来进行索引的创建
- 主分片(shard):把索引库拆分为多份,分别放在不同的节点上,比如有3个节点,3个节点的所有数据内容加在一起是一个完整的索引库。分别保存到三个节点上,目的为了水平扩展,提高吞吐量。也可以做到故障转移。ES自动管理和组织分片, 并在必要的时候对分片数据进行再平衡分配, 所以用户基本上无需担心分片的相关处理细节
- 副本分片(replica):每个shard的备份。也可以称之为副本,ES默认为一个索引创建5个主分片, 并分别为其创建一个副本分片。意思就是说每个索引都由5个主分片(shard)形成,而每个主分片都相应的有一个备份(replica)。
- 分片机制
每个索引可以被分片,就相当于吃披萨的时候被切了好几块,然后分给不同的人吃,如下图所示:
- 索引my_doc只有一个主分片;
- 索引shop有3个主分片;
- 索引shop2有5个主分片。
- 每个主分片都包含索引的数据,由于目前是单机,所以副本分片是没有的,这个时候集群健康值显示为黄色。
- 副本分片是主分片的备份,主挂了,备份还是可以访问,这就需要用到集群了。
- 同一个分片的主与副本是不会放在同一个服务器里的,因为一旦宕机,这个分片就没了
- 我不知道大家有没有玩过nas,这个数据存储有点像raid机制。
es 健康度
不同的颜色表示es不同的健康程度
- 绿色:集群健康,所有主分片和副本分片都是可用状态。
- 黄色:亚健康,所有的主分片可用,但是副本分片部分不可用。
- 红色:不健康,主分片部分不可用。
ES - GEO地理位置
0. 必学英文单词
- longitude: [ˈlɒŋɡɪtjuːd] 经度
- latitude: [ˈlætɪtuːd] 纬度
- 通过经纬度可以定位在地球上的某一个点
1. 拾取坐标
那么接下来我们可以通过地图来拾取一些坐标,当然如果是在app上,用户在进行搜索的时候,是会通过手机来获得当前的坐标点,通过这个坐标点来进行相关的搜索业务的。
- http://api.map.baidu.com/lbsapi/getpoint/index.html
- http://www.jq22.com/yanshi18814
- 注意:每个地图的坐标都是不同的,百度,谷歌,高德等自家的坐标系都是独立的。哪怕通过物理设备在室外拿到的坐标,也是需要根据一定的规范进行坐标转换才能针对不同的地图去使用。
- http://lbsyun.baidu.com/ 百度地图api
- http://lbsyun.baidu.com/cms/jsapi/reference/jsapi_reference.html 核心类参考
- 慕课网的文章参考:https://www.imooc.com/article/72571
2. 使用postman创建mappings映射
- userId: 用户id
- userName: 用户名
- geo: 用户上一次出现的位置
- place: 位置名称
POST /friends/_mapping (es6为/friends/_doc/_mapping) { "properties": { "userId": { "type": "long" }, "userName": { "type": "text" }, "geo": { "type": "geo_point" }, "place": { "type": "text" } } }
3. 插入geo数据
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": "北极阁公园" } # 杭州大学 { "userId": 1008, "userName": "Magneto", "geo": { "lon": 118.797105, "lat": 32.066134 }, "place": "杭州大学" } # 杭州邮电大学 { "userId": 1009, "userName": "GreenArrow", "geo": { "lon": 118.936814, "lat": 32.121167 }, "place": "杭州邮电大学" } # 杭州师范大学 { "userId": 1010, "userName": "BatMan", "geo": { "lon": 118.916549, "lat": 32.111014 }, "place": "杭州师范大学" }
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, 慕课网非常牛!",
"create_date": "2019-12-24"
}
6. 以矩阵的形式查询范围内的坐标
以
左上
和
右下
为基准所画的矩阵中,只要包含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. 自定义区域搜索
使用场景:大气环境监测,国控的,激光雷达设备所组成的一个范围
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. 从当前位置搜索一定范围内的朋友
互动
:使用场景最多,比如:
- 微信摇一摇搜好友
- 探探app左滑右滑匹配好友
- 抖音显示同城附近好友所拍的短视频
- 携程app搜索附近酒店
- 大众点评搜索附近饭店
- 搜索附近空闲的共享单车
- 出租车叫车服务,查看车子到哪里了
- 物流app找车找货
GET /friends/_doc/_search { "query": { "geo_distance": { "distance": "50m/1km/10km", "geo": { "lon": 118.795739, "lat": 32.026973 } } } }
9. 搜索区间范围内的好友个数
常用于主动的推荐:
- 比如主动推荐说在一定范文内有多少个朋友你可能认识
- 比如主动推荐一定距离范文内有多少车源或者货源
用于统计距离某个点位置100米,500米,2公里范围内的坐标数量。
单位:一般用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 (二维码自动识别)