为了账号安全,请及时绑定邮箱和手机立即绑定

慕课网 20200330 es+geo+baidu-map 直播视频与文字版笔记

标签:
Spring

视频版本

视频已经由慕课网上传至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搜索不如专业的搜索引擎靠谱

简单聊一聊倒排索引

-w760

2. es的核心术语与数据结构

  • 核心术语
    • ES --> 数据库(1)
    • 索引index --> 表(2)
    • 文档 document --> 行(记录)(3)
    • 字段 fields --> 列(4)
    • 类型type 过期,也能作为表
      -w619
      -w385

-w1276

  • 数据结构,数据库表记录,对应es:
    -w451

文档的数据如何体现,或者说是怎样的数据格式?


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://www.imooc.com/article/286936
这个基于centos6,架构师课程基于centos7

4. head插件,索引index创建与映射mappings创建

索引名: friends
-w616

分片与集群,健康度

*简称(附)

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不同的健康程度

  1. 绿色:集群健康,所有主分片和副本分片都是可用状态。
  2. 黄色:亚健康,所有的主分片可用,但是副本分片部分不可用。
  3. 红色:不健康,主分片部分不可用。

ES - GEO地理位置

0. 必学英文单词

  • longitude: [ˈlɒŋɡɪtjuːd] 经度
  • latitude: [ˈlætɪtuːd] 纬度
  • 通过经纬度可以定位在地球上的某一个点

1. 拾取坐标

那么接下来我们可以通过地图来拾取一些坐标,当然如果是在app上,用户在进行搜索的时候,是会通过手机来获得当前的坐标点,通过这个坐标点来进行相关的搜索业务的。

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. 以矩阵的形式查询范围内的坐标

屏幕快照 2020-01-01 12.32.34
左上右下为基准所画的矩阵中,只要包含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

  • distance_type:
    • arc:最高精度
    • plane:最高效率,精度略模糊
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
	        		}
	        	]
	        }
	    }
    }
}
点击查看更多内容
“小礼物走一走,来慕课关注我”
赞赏支持
风间影月说 去围观
创业公司技术总监, 10年+开发和技术管理经验。SUN认证SCJP、PMP、MCP认证。主要从事后端技术和架构领域,有丰富的电商平台与物流平台核心系统的架构设计和开发经验。
评论

作者其他优质文章

正在加载中
全栈工程师
手记
粉丝
1.2万
获赞与收藏
904

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消