一、ES中概念与MySql的对应关系
index | 数据库 |
type(从7.x已弃用,只使用_doc) | 表 |
document | 行 |
field | 列 |
二、常用命令
1、_cat
# 在最后加 ?v 可显示每列的名称
# 查看所有节点 *代表是主节点
GET /_cat/nodes
http://192.168.109.100:9200/_cat/nodes
# 127.0.0.1 16 93 20 0.56 0.84 0.59 dilm * f8d775325d85
# 查看es健康状况
GET /_cat/health
http://192.168.109.100:9200/_cat/health
# 1724719550 00:45:50 elasticsearch yellow 1 1 5 5 0 0 2 0 - 71.4%
# 查看主节点
GET /_cat/master
http://192.168.109.100:9200/_cat/master
# Uuzun4ScS2-AZnomatLM_g 127.0.0.1 127.0.0.1 f8d775325d85
# 查看所有索引 ,等价于mysql数据库的show databases;
GET/_cat/indicies
http://192.168.109.100:9200/_cat/indices
# yellow open bank PYfkMXuhSwqyogwQCXx3Hg 1 1 1000 0 414.1kb 414.1kb
# green open .kibana_task_manager_1 v4QVfo8-St6AASmtQoj19Q 1 0 2 0 26.2kb 26.2kb
# green open .apm-agent-configuration uq8UqZc9SqKWyGN6-3e__A 1 0 0 0 283b 283b
# green open .kibana_1 6c0YiB8-TgeYbRweqtBOoQ 1 0 19 6 43.7kb 43.7kb
2、新增/修改/删除
# PUT和POST都可以
# POST新增。如果不指定id,会自动生成id。指定id就会修改这个数据,并新增版本号;
# PUT可以新增也可以修改。PUT必须指定id;由于PUT需要指定id,我们一般用来做修改操作,不指定id会报错。
# 唯一区分是post不指定id时永远为创建
# 要指定类型
PUT customer/_doc/1
{
"name":"John Doe"
}
# 更新文档 _update
POST customer/_doc/1/_update
{
"doc":{
"name":"111"
}
}
# 或者
POST customer/_doc/1
{
"doc":{
"name":"222"
}
}
# 或者
PUT customer/_doc/1
{
"doc":{
"name":"222"
}
}
#不同:带有update情况下
# POST操作会对比源文档数据,如果相同不会有什么操作,文档version不增加。
# PUT操作总会重新保存并增加version版本
# POST时带_update对比元数据如果一样就不进行任何操作。
# 看场景:
# 对于大并发更新,不带update
# 对于大并发查询偶尔更新,带update;对比更新,重新计算分配规则
# POST更新文档,带有_update
# 删除指定id的记录
DELETE customer/_doc/1
# 删除索引
DELETE customer
3、批量操作
# 语法格式
{action:{metadata}}\n
{request body }\n
{action:{metadata}}\n
{request body }\n
# 批量新建或者修改
POST /customer/extrnal/_bulk
{"index":{"_id":"1"}}
{"name":"John Doe"}
{"index":{"_id":"2"}}
{"name":"John Doe"}
# 对所有索引批量操作
POST /_bulk
{"delete":{"_index":"website","_type":"_doc","_id":"123"}}
{"create":{"_index":"website","_type":"_doc","_id":"123"}}
{"title":"my first blog post"}
{"index":{"_index":"website","_type":"_doc"}}
{"title":"my second blog post"}
{"update":{"_index":"website","_type":"_doc","_id":"123"}}
{"doc":{"title":"my updated blog post"}}
# bulk API 以此按顺序执行所有的 action (动作)。如果一个单个的动作因任何原因而失败,它将继续处理它后面剩余的动作。当 bulk API 返回时,它将提供每个动作的状态(与发送的顺序相同),所以您可以检查是否一个指定的动作是不是失败了。
4、检索
a、基础检索
# 常规检索
GET bank/_search
{
"query": {
"match_all": {}
},
"from": 0,
"size": 5,
"sort": [
{
"account_number": {
"order": "desc"
}
}
]
}
# 返回部分字段
GET bank/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"balance": {
"order": "desc"
}
}
],
"from": 0,
"size": 5,
"_source": ["balance","firstname"]
}
# mach_phrase 只要包含就可以
GET /bank/_search
{
"query": {"match_phrase": {
"address": "mill road"
}}
}
# 加上 keyword ,则必须完全匹配
GET bank/_search
{
"query": {
"match": {
"address.keyword": "990 Mill Road"
}
}
}
# city或者address中包含mill,并且在查询过程中,会对于查询条件进行分词
GET bank/_search
{
"query": {
"multi_match": {
"query": "mill",
"fields": ["address","city"]
}
}
}
b、bool 复合查询
# 复合语句可以合并,任何其他查询语句,包括符合语句。这也就意味着,复合语句之间可以互相嵌套,可以表达非常复杂的逻辑。
# 查询gender=m,并且address=mill的数据
GET bank/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"gender": "M"
}
},
{
"match": {
"address": "mill"
}
}
]
}
}
}
c、term 匹配
# 全文检索字段用match,其他非text字段匹配用term
GET bank/_search
{
"query": {
"term": {
"address": "mill Road"
}
}
}
d、Aggregation 聚合
# 语法格式
"aggs":{
"aggs_name这次聚合的名字,方便展示在结果集中":{
"AGG_TYPE聚合的类型(avg,term,terms)":{}
}
},
# 搜索address中包含mill的所有人的年龄分布以及平均年龄,但不显示这些人的详情
GET bank/_search
{
"query": {
"match": {
"address": "Mill"
}
},
"aggs": {
"ageAgg": {
"terms": {
"field": "age",
"size": 10
}
},
"ageAvg": {
"avg": {
"field": "age"
}
},
"balanceAvg": {
"avg": {
"field": "balance"
}
}
},
"size": 0
}
# 按照年龄聚合,并且求这些年龄段的这些人的平均薪资
GET bank/_search
{
"query": {
"match_all": {}
},
"aggs": {
"ageAgg": {
"terms": {
"field": "age",
"size": 100
},
"aggs": {
"ageAvg": {
"avg": {
"field": "balance"
}
}
}
}
},
"size": 0
}
# 查出所有年龄分布,并且这些年龄段中M的平均薪资和F的平均薪资以及这个年龄段的总体平均薪资
GET bank/_search
{
"query": {
"match_all": {}
},
"aggs": {
"ageAgg": {
"terms": {
"field": "age",
"size": 100
},
"aggs": {
"genderAgg": {
"terms": {
"field": "gender.keyword"
},
"aggs": {
"balanceAvg": {
"avg": {
"field": "balance"
}
}
}
},
"ageBalanceAvg": {
"avg": {
"field": "balance"
}
}
}
}
},
"size": 0
}
e、mapping 映射
# 创建索引并制定映射
PUT /my_index
{
"mappings": {
"properties": {
"age": {
"type": "integer"
},
"email": {
"type": "keyword"
},
"name": {
"type": "text"
}
}
}
}
# 查看映射
GET /my_index
GET bank/_mapping
# 添加新的字段映射 index为false指这个字段不能被检索
PUT /my_index/_mapping
{
"properties": {
"employee-id": {
"type": "keyword",
"index": false
}
}
}
# 更新映射
# 对于已经存在的字段映射,我们不能更新。更新必须创建新的索引,进行数据迁移
POST reindex
{
"source":{
"index":"twitter"
},
"dest":{
"index":"new_twitters"
}
}