文章目录
视频教程:b站狂神说(springboot后面的不用看,因为公司不一定用starter去开发,熟练基础才是重点)
概念
ELK软件栈
- Kibana:负责数据展示等
- ElasticSearch:负责搜索等
- Logstash:负责数据采集等
安装
ES
- mac下载gz文件并解压
- 进入bin目录运行elasticsearch脚本即可
- 使用浏览器或curl测试http://localhost:9200
Kibana
- mac下载gz文件并解压
- 进入bin目录运行kibana脚本即可
- 使用浏览器访问http://localhost:5601
conf/kibana.yml
进行汉化配置i18n.locale: "zh-CN"
入门使用:https://elasticstack.blog.csdn.net/article/details/103118342(入门1即可+介绍)
开发工具实现REST请求
IK分词器(玩玩)
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.6.2/elasticsearch-analysis-ik-7.6.2.zip
重要概念
集群cluster
由各种node构成,master node 管理集群,包括索引的创建、添加、删除等、data node 用于存放数据
节点node
相当于一个es实例。有很多种类型,如master/data node 等
索引index
文档的集合体,相当于mysql的database
类型type
相当于数据库的表,6之后由于一个index只对应一个type(默认_doc),因为多个type中存在相同字段会混乱。
他能够动态的修改Mapping,也就是你添加一个字段,他会动态生成字段和类型的映射。而不像传统数据库,需要先定义字段类型,也就是create table
分片shard
索引的分片,将文档通过哈希计算落在不同分片,减少大索引(10亿文档)无法存储以及读取效率差的问题。
分为主分片(读写)和副本分片(只读),副本分片可提升为主分片
GET/PUT /索引/_settings #添加修改
如果是集群,也就是非单节点,主分片和副分片是存放在不同节点的,这样就能保证,即便一个node坏了,也不会丢失数据
命令操作
查看ES信息
创建索引
💡如果类型不指定,对于传值需要保证类型一致,否则报错
ES
基本要求:掌握集群部署 ,了解基本配置项的含义。掌握常用的的接口功能,包括数据、分片的增删改查等操作
使用Java调通读写操作
#索引文档操作
创建或修改db1索引
PUT/POST
PUT db1
{
"mappings": {
"properties": {
"name":{
"type": "text"
},
"age":{
"type": "long"
}
}
}
}
查看索引
GET db1
删除索引
DELETE db1
添加或修改文档
PUT/POST
PUT db1/_doc/1
{
"name":"迪哥",
"age":17
}
💡1代表该文档的一个唯一id
局部修改文档
上面的添加重复执行的话只会修改,但是是全局覆盖,例如你要改年龄,但这样会导致迪哥不见了。虽然你可以重新把name字段也写上去。但如果字段多就麻烦了,所以我们需要局部修改。
# 迪哥丢失
PUT db1/_doc/1
{
"age":18
}
# 使用_update 局部修改
POST db1/_doc/1/_update
{
"doc":{
"age":20
}
}
创建文档的同时创建索引
PUT db/_doc/1
{
"name":"知道尼玛"
}
# 创建第二条文档
PUT db/_doc/2
{
"name":"知道尼玛"
}
查看文档2
GET db/_doc/2
删除文档2
DELETE db/_doc/2
查看全部文档
GET db/_doc/_search
#搜索GET
keyword和text类型,keyword类型不会被分词,作为整体,但text类型会被分词,而且英文和中文的分词也不一样,英文是按空格,中文是按字
模糊搜索
# _source只查询指定字段 sort用于排序 from size用于分页
GET db/_doc/_search
{
"query": {
"match": {
"name": ""
}
}
, "_source": ["name"]
, "sort": [
{
"name.keyword": {
"order": "desc"
}
}
],
"from":0,
"size":1
}
存在问题:如果name字段的类型是由创建索引时指定,且没有添加fields keyword(而使用如果创建索引的同时创建文档时,类型会自动判断,且会生成fields keyword),此时name字段是无法进行排序的(可能是因为他不是关键字,不知道如何排序–可分词),但像long类型则没有这种情况,因为数字类型是精确匹配的,没有所谓的分词。这个时候有两种解决方法
# 1.根据报错提示添加fielddata
POST db2/
{
"mappings": {
"properties": {
"name": {
"type": "text",
"fielddata":true
}
}
}
}
# 2.使用name.keyword进行排序
"sort":{
"name.keyword":{
"order":"desc"
}
}
精确查询?
term 通过倒排索引进行精确查询
match 通过分词器解析
# 类似should
GET db/_doc/_search
{
"query":{
"match":{
"name": "zdm 霍格"
}
}
}
# term
GET db3/_doc/_search
{
"query":{
"term":{
"name": "zdm"
}
}
}
多条件查询
# bool查询 多条件 must(and) should(or) must_not(取反)
GET db/_doc/_search
{
"query":{
"bool":{
"must": [
{
"match":{
"name": "地"
}
},
{
"match": {
"age": 17
}
}
]
}
}
}
# 添加过滤 lt gt less/greater than
GET db/_doc/_search
{
"query":{
"bool":{
"filter": {
"range":{
"age":{
"lt":18
}
}
}
}
}
}
查看集群信息
GET /
GET /db/_shard_stores
GET /db/_settings
GET _cluster/state
GET _cluster/health
GET _cat/health # 系统健康
GET _cat/nodes #系统节点情况
GET _cat/shards #系统分片情况
# 索引情况
GET _cat/indices?v
GET _cat/indices/db
GET /db/_shard_stores
GET /db/_settings