微服务进阶整合学习高级篇--ElasticSearch
搜索分析引擎ElasticSearch
ElasticSearch三大基本概念
1. index-索引
EL中,index索引区别与Mysql中的索引。EL建立一个索引等同于在Mysql数据库中建立一个数据库。动词:相当于mysql的insert;名词:相当于mysql的db
2. type-类型
type在EL中等同与在Mysql中数据库的某一个表。
3. document-文档
document在EL中等同于在Mysql中的一条条的数据,不同的是这些数据是没有像mysql那样具有固定的列属性的。
- mysql与el的对应关系,如下图表格所示:
Mysql | ElasticSearch |
---|---|
DataBase | Index |
Table | Type |
Data | Document |
docker安装ElasticSearch
1. 切换到管理员su root
下载docker或者在命令前加上sudo
(sudo) docker pull elasticsearch:7.4.2
(sudo) docker pull kibana:7.4.2
2. free -m
查看内存使用情况
3. 创建目录供后续进行磁盘挂载
#mkdir -p递归创建目录
mkdir -p /mydata/elasticsearch/config
mkdir -p /mydata/elasticsearch/data
4. 创建配置文件并写入数据
# es可以被远程任何机器访问
echo "http.host: 0.0.0.0" >/mydata/elasticsearch/config/elasticsearch.yml
5. 进行磁盘挂载
# -e指定是单阶段运行
# -e指定占用的内存大小
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.4.2
# 设置开机启动elasticsearch
docker update elasticsearch --restart=always
6. 赋予EL权限
# 递归更改权限,es需要访问
chmod -R 777 /mydata/elasticsearch/
7. 访问端口查看是否配置成功
http://192.168.56.10:9200
8. 安装启动kibana
# kibana指定了了ES交互端口9200
# 5600是kibana主页端口
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.56.10:9200 -p 5601:5601 -d kibana:7.4.2
9. 访问kibana首页
http://192.168.56.10:5601
ElasticSearch基本入门
1. _cat命令
http://192.168.56.10:9200/_cat/nodes--查看所有的节点
http://192.168.56.10:9200/_cat/health--查看EL健康情况
http://192.168.56.10:9200/_cat/master--查看主节点信息
http://192.168.56.10:9200/_cat/indices--查看所有数据库
2. put/post请求新增
post请求
http://192.168.56.10:9200/customer/external/1
json:{
"name":"test"}
put请求
http://192.168.56.10:9200/customer/external/1
json:{
"name":"test"}
两者本质效果都一样,意思是往customer数据库中的external表插入id为1的数据,具体数据为json格式的数据,但是post和put又有区别
post | put |
---|---|
可以不写id,自动生成id | 必须写id |
id不存在则插入,存在则更新 | 必须写id |
用于新增 | 可用于新增或者修改 |
版本号不一定会增加 | 版本号version一定会增加 |
3. get请求查看文档
get请求https://ElasticSearch地址与端口/索引名/类型名/id主键
http://192.168.56.10:9200/customer/external/1
4. put请求进行更新
可以通过版本号来对数据进行修改,其中_seq_no是并发控制字段,每次更新都会+1。_primary_term是主分片重新分配,如重启,就会变化
版本号不一致发生的更新错误情况。
5. post请求+_update命令更新文档
POST customer/externel/1/_update ---后面跟了_update一定要带doc,不然报错,比较内容如果一致,版本号不会变化
{
"doc":{
"name":"111"
}
}
或者
POST customer/externel/1 --doc可带可不带,版本号一定会变化
{
"doc":{
"name":"222"
}
}
或者
PUT customer/externel/1 ---put版本号会变化
{
"doc":{
"name":"222"
}
}
或者
PUT customer/externel/1 ---put版本号会变化
{
"name":"222"
}
6. 删除操作
# ElasticSearch只能删库(Index)或者删数据(document),不能删除表(type)
DELETE customer/external/1
DELETE customer
7. 批量操作_bulk指令
语法格式
#一行为一次操作,该操作只能在kibana上执行,post满无法识别换行
#对整个es实体进行操作
POST /_bulk
{
"delete":{
"_index":"website","_type":"blog","_id":"123"}}
{
"create":{
"_index":"website","_type":"blog","_id":"123"}}
{
"title":"my first blog post"}
{
"index":{
"_index":"website","_type":"blog"}}
{
"title":"my second blog post"}
{
"update":{
"_index":"website","_type":"blog","_id":"123"}}
{
"doc":{
"title":"my updated blog post"}}
8. 测试数据
ES进阶
1. ES开发文档
2. QueryDSL格式查询
#假如数据量够多,默认返回10条数据,不回全部返回所有数据。
GET /bank/_search
{
"query": {
"match_all": {
} #查询的字段,为空则表示查询所有
},
"from": 0, #从第几条开始查
"size": 5, #查询多少条记录
"_source":["balance"], #要返回的字段
"sort": [ #排序
{
"account_number": {
#按照哪个字段排序
"order": "desc" #排序的顺序
}
}
]
}
3. query/match匹配查询
- 当匹配的类型为
非字符串
的时候,进行精确匹配,相当于mysql中的 where xxx = xxx
GET bank/_search
{
"query": {
"match": {
"account_number": "20" # 字段名:值
}
}
}
#返回数据
{
"took" : 14,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "bank",
"_type" : "account",
"_id" : "20",
"_score" : 1.0,
"_source" : {
"account_number" : 20,
"balance" : 16418,
"firstname" : "Elinor",
"lastname" : "Ratliff",
"age" : 36,
"gender" : "M",
"address" : "282 Kings Place",
"employer" : "Scentric",
"email" : "elinorratliff@scentric.com",
"city" : "Ribera",
"state" : "WA"
}
}
]
}
}
- 当匹配的类型为字符串的时候,进行全文检索,相当于mysql中的where xxx like ‘%xxx%’。会进行分词查询
GET bank/_search
{
"query": {
"match": {
"address": "kings"
}
}
}
#返回结果
{
"took" : 23,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 5.9908285,
"hits" : [
{
"_index" : "bank",
"_type" : "account",
"_id" : "20",
"_score" : 5.9908285,
"_source" : {
"account_number" : 20,
"balance" : 16418,
"firstname" : "Elinor",
"lastname" : "Ratliff",
"age" : 36,
"gender" : "M",
"address" : "282 Kings Place",
"employer" : "Scentric",
"email" : "elinorratliff@scentric.com",
"city" : "Ribera",
"state" : "WA"
}
},
{
"_index" : "bank",
"_type" : "account",
"_id" : "722",
"_score" : 5.9908285,
"_source" : {
"account_number" : 722,
"balance" : 27256,
"firstname" : "Roberts",
"lastname" : "Beasley",
"age" : 34,
"gender" : "F",
"address" : "305 Kings Hwy",
"employer" : "Quintity",
"email" : "robertsbeasley@quintity.com",
"city" : "Hayden",
"state" : "PA"
}
}
]
}
}
4. query/match_phrase [不拆分匹配]
- 该匹配检索的关键词不会进行分词处理
GET bank/_search
{
"query": {
"match_phrase": {
"address": "mill road" #将mill road当成一个搜索关键词进行处理,而不是进行分词成mill || road进行查询
#相当于mysql中的where xxx like
}
}
}
- 或者通过
字段.keyword
进行全匹配查询,该查询区分大小写,相当于mysql中where xxx = xxx
GET bank/_search
{
"query": {
"match": {
"address.keyword": "mill road"
}
}
}
query/match/字段 | query/match_phrase/字段 | query/match/字段.keyword |
---|---|---|
分词 | 不分词 | 不分词 |
模糊查询 | 模糊查询 | 全匹配查询 |
5. query/multi_math[多字段匹配]
- 相当于指定mysql中某一列的条件,如:select from xxx where xxx = xxx
and xxx like xxx and xxx like xxx。该查询会进行分词处理。
GET bank/_search
{
"query": {
"multi_match": {
# 前面的match仅指定了一个字段。
"query": "mill road", # 要检索的关键词,会进行分词处理
"fields": [ # 在state,address里进行检索。要求state和address有mill子串,不要求都有
"state",
"address"
]
}
}
}
#返回结果
{
"took" : 4,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 32,
"relation" : "eq"
},
"max_score" : 8.926605,
"hits" : [<