ElasticSearch工具
1. 介绍
- elasticsearch分布式全文搜索引擎,的主要功能是搜索(全文搜索、结构化搜索、分析)、数据清洗,安装工具时最低要求为JDK1.8,可以处理PB级数据;
- ELK
(1)Elasticsearch、Logstash、Kibana三大开源框架的缩写;
(2)收集清洗数据 -> 搜索存储数据 -> Kibana前端页面;
(3)默认端口:ES:9200 Kibana:5601;
(4)面向文档; - ElasticSearch与Relational DB的对比
Relational DB | ElasticSearch |
---|---|
数据库(database) | 索引(index) |
表(tables) | type |
行(rows) | documents |
字段(columns) | fields |
微服务技术栈
- 微服务技术栈架构图
- 五大技术栈
(1)微服务治理
① 注册发现
② 远程调用
③ 负载均衡
④ 配置管理
⑤ 网关路由
⑥ 流量控制
⑦ 系统保护
⑧ 服务授权
⑨ 熔断降级
⑩ 分布式任务
⑪ TCC模型
⑫ AT模型
⑬ Seata
(2)异步通信技术
① MQ消息类型
② SpringAMQP
③ 消息堆积问题
④ 消息可靠性
⑤ 仲裁队列
⑥ 延迟队列
⑦ 镜像集群
⑧ 数据持久化
(3)缓存技术
① 缓存穿透、雪崩
② SringDataRedis
③ Redis主从复制
④ 缓存数据同步
⑤ OpenResty
⑥ 缓存数据同步
⑦ Nginx本地缓存
⑧ Redis持久化
⑨ 多级缓存分层
⑩ Redis分布集群
⑪ Lua脚本
⑫ Redis数据结构
(4)DevOps
① Dockerfile
② DockerCompose
③ GrayLog
④ Jenkins
⑤ skywalking
⑥ Docker
⑦ K8S
(5)搜索技术
① DSL语句
② ES集群
③ RestAPI
④ 集群脑裂
⑤ 竞价排名
⑥ 聚合统计
⑦ 自动补全
⑧ 地理坐标
⑨ 拼音分词
ES检索基本使用
1. 全文检索命令
- http://{ip}:9200/_cat/master
2. 查看索引命令
- _cat/indices(相当于sql中show database; 命令)
3. 保存数据
- PUT customer/external/1 {“name”: “json”}
解释: 在customer索引下,external类型下保存id = 1的数据为{“name”: “json”} - PUT 带id
第一次为保存该条数据, 多次发送该请求为更新该数据 - POST请求
(1)带id 第一次为新增该数据, 多次发送请求为更新该数据
(2)不带id 新增操作,永远新增
4. 查询数据
- GET请求
- 乐观锁修改
(1)字段:_seq_no:并发控制字段,每次更新数值加一
(2)primary_term: 功能同上, 主分片重新分配, 如重启, 字段值就会发生变化
(3)更新数据携带:?if_seq_no = 0 & if_primary_term = 1
5. 更新文档
- POST/PUT customer/extenal/1/_update {“doc”: {" "}}
– 如果携带_update字段, 如果更新数据和原始数据一样, 则不作任何操作
– 如果吧不携带_update字段, 更新数据时会不断进行更新, 不会对比原始数据
6. 删除文档
DELETE
- 删除某一条数据: DELETE customer/extenal/1
- 删除索引: DELETE customer
7. 批量导入API
注: 请求体必须换行
_bluk
POST http://{ip}:9200/customer/extenal/_bluk
{“操作”: “id”: “1”}
{“请求体”: " "}
例1:
{"index":{"id": "1"}}
{"name": "John"}
例2:
POST _bluk
# 删除语句
{"delete": {"index":"web", "_type": "blog", "id": "123"}}
# 创建语句
{"create": {"index":"web", "_type": "blog", "id": "123"}
{"title": "hello"}}
# 查询语句
{"index":{"index":"web", "_type": "blog", "id": "123"}
{"title": "hello"}}
# 更新语句
{"update": {"index":"web", "_type": "blog", "id": "123"}
{"doc": {"title": "hello"}}}
8. SearchAPI全文检索
_search
# url+检索参数
GET bank/_search?q=*&sort=account_number: asc
# url+请求体
GET bank/_search
{"query":{"match":{}}},
"sort":[
{"account_number":"asc"}
]
9. ES检索基本方式
① REST request URL (url+检索参数)
②REST request body (url+请求体)
“_source”: ["…", “…”] 返回指定字段
- match匹配查询 (精确查询, 模糊匹配)
– 全文检索, 按照选文进行匹配 - match_pharse 短语匹配
- multi_match 多字段匹配
"multi_match": {"query": "......",
"fileds": ["adress": "......"]}
匹配字段包含fileds, query中所有字段
10. bool符合查询
# 必须
"must": {"match":{
"gender": "F"
}},
"match": {{}}
# 必须不匹配
"must_not": {}
# 应该
"should": {}
11. filter结果过滤
不会计算相关性得分
12. term查询
注: keyword 精确值查询
如果查询的为非文本字段, 通常使用term
如果查询的是文本字段, 通常使用match
13. es执行集合aggregations
数组分组和提取数据的功能
相当于mysql中的GROUP_BY和SQL聚合
# 聚合语句
"aggregations": {
"<aggregations_name>": {
"<aggregations_type>": {
"<aggregations_body>"
}
[,"meta": {["<meta_body>"]}]?
[,"aggregations": {["<sub_aggregation>"]+}]?
},
"<aggregations_name2>"
}
# 例: 搜索address中包含mail的所有人的年龄分布以及平均年龄
GET bank/_search
{
"query": {
"match": {
"address": "mail"
}
},
"aggs": {
"aggAgg": {
"terms": {
"filed": "age",
"size": 10
}
},
"aggavg": {
"avg": {
"filed": "avg"
}
}
}
}
Mapping映射
用来定义一个文档以及他所包含的属性filed是如何存储和索引的;
- 哪些字符串属性应该被看做全文本属性(full text fields)
- 哪些属性包含数字, 日期和地理位置
- 文档中所有属性是否都可以被索引(_all配置)
- 日期格式
- 自定义映射规则来执行动态添加属性
1. 创建mapping
PUT /my_index
{"mappings":{
"properties":{
"age": {"type": "interger"}
"email": {"type": "keyword"}
}
}}
2. 增加mapping
PUT /my_index/_mapping
{
"mappings": {
"properties": {
"<mapping_name>":{
"type": "keyword",
"index": False # index为True可以被检索,为False不能被检索
}
}
}
}
3. 修改映射&数据迁移
- 创建新索引
- 数据迁移
# 将老数据迁移到指定位置
POST _reindex
{
"_source":{
"index": "twitter"
},
"dest": {
"index": "new_twitter"
}
}
分词
一个tokenizer(分词器)将之分割成独立的token
POST _analyse
{
"analyzer": "standard",
"text": "<需要做分词的文本内容>"
}
分词器词库: ik