ES常用系统命令CRUD命令以及常见问题(持续更新)

文章目录


查询返回字段解析


{
  "took": 252, #表示查询的执行时间,以毫秒为单位。这里的值为 252 毫秒,表示查询花费了 252 毫秒的时间。
  "timed_out": false,   #表示查询是否超时。这里的值为 false,表示查询未超时
  "_shards": {  #表示分片的信息,用于表示查询在分片级别的执行情况。
    "total": 5, #表示总共有 5 个分片
    "successful": 5,    #表示成功执行的分片数,与总分片数相同
    "skipped": 0,   #表示跳过的分片数,这里的值为 0。
    "failed": 0 #表示失败的分片数,这里的值为 0。
  },
  "hits": { #表示查询结果的相关信息
    "total": {  #表示匹配的文档总数
      "value": 1,   #表示匹配的文档总数为 1
      "relation": "eq"  #表示匹配关系为 "eq"(等于)
    },
    "max_score": 2, #表示最高得分
    "hits": [   #包含了匹配的文档结果数组
      { #
        "_index": "msd_recruiting_candidate",   #表示文档所属的索引
        "_type": "_doc",    #表示文档的类型
        "_id": "16705", #表示文档的 ID
        "_score": 2,    #表示文档的得分
        "_source": {    #包含了文档的源数据
          "candidateId": 16705,
          "postId": 203,
          "postName": "web前端开发(社招)",
          "resumeId": 19259,
          "resumeRealName": "大号扫小号"
        }
      }
    ]
  }
}

简介

系统命令

集群和节点级别的查询和配置

查看集群健康状况
GET _cat/health
查询ES中所有的index
GET /_cat/indices?v
GET _all
集群配置

GET _cluster/settings?flat_settings

获取节点信息

GET _cat/nodes?v&h=http,v,Wj,dt,du,da,dup,hc,hp,hm,rc,rp,rm,m,sc,sm,siwm,svmm,l,name,r

当前正在运行的任务&堆积任务列表-task
#当前进行的任务
GET _cat/tasks?v
#等待执行的任务
GET _cat/pending_tasks?v
分片恢复 - recovery
GET _cat/recovery?v&h=i,s,t,ty,st,shost,thost,f,fp,b,bp,to,tor,top&active_only
索引分片未分配原因分析 - unassigned_explain
#分析分片未分配原因
GET _cluster/allocation/explain
#默认失败5次后不再进行分片分配,尝试重新进行索引分配
POST _cluster/reroute?retry_failed=true
集群配置(推荐,视情况调整)–cluster/settings
PUT _cluster/settings
{
  "persistent": {
    "action.destructive_requires_name": "true",
    "cluster.routing.allocation.cluster_concurrent_rebalance": "10",
    "cluster.routing.allocation.disk.watermark.high": "85%",
    "cluster.routing.allocation.disk.watermark.low": "80%",
    "cluster.routing.allocation.enable": "all",
    "cluster.routing.allocation.node_concurrent_recoveries": "2",
    "cluster.routing.allocation.same_shard.host": "true",
    "indices.recovery.max_bytes_per_sec": "200mb",
    "xpack.monitoring.collection.enabled": "true"
  },
  "transient": {}
}
关闭集群只读状态
PUT _cluster/settings
{
"persistent": {
    "cluster.blocks.read_only_allow_delete": null
    }
}

索引和模板

获取模板列表–template

GET _cat/templates?v

获取索引信息 - index

GET _cat/indices?v

获取分片信息 - shard

GET _cat/shards?v

获取单个索引配置信息–index_settings

GET index-name/_settings?flat_settings

更改索引延迟恢复 – delay_time_out
PUT /index_name/_settings
{
  "settings": {
    "index.unassigned.node_left.delayed_timeout": "24h"
  }
}
限制某个索引在单个节点上分片数量上限(含副本) – 索引分片均匀分布
PUT /index_name/_settings
{
  "settings": {
     "index.routing.allocation.total_shards_per_node": "1"
  }
}
解决索引只读–read_only
PUT _all/_settings
{
  "index.blocks.read_only_allow_delete": "false"
}
设置索引分片不能分配/只分配到指定节点上–节点亲和
PUT index_name/_settings
{
   "index.routing.allocation.exclude._ip": "10.4.81.122"
}
修改副本为0–index-name/_settings
#修改副本为0 
PUT index-name/_settings
{
  "index.number_of_replicas": "0"
}
#修改副本为1
PUT index-name/_settings
{
  "index.number_of_replicas": "1"
}
索引reindex
# 查询正在reindex的任务
GET _tasks?detailed=true&actions=*reindex

# 根据id取消正在执行的任务
POST /_tasks/bo2rAIL0RvC108pHAAQzQQ:47433230/_cancel

# reindex命令
# slice数量最好和分片数相等
# batch size 一个比较好的起始点是10mb-15mb,比如一条数据是2kb,5000可能是个合理值
POST _reindex?slices=5&refresh
{
 "source": {
   "index": "supermarket_stock_v1",
   "size": 5000
 },
 "dest": {
   "index": "supermarket_stock_v2"
 }
}

CRUD

查询

查询所有文档

使用match_all 可以查询到所有文档,是没有查询条件下的默认语句

# 查询 GET /[_index]/_search
GET /msd_recruiting_candidate/_search
{
  "query":{
      "match_all": {}
  }
}

#GET /[_index]/[_type]/_search
GET /msd_recruiting_candidate/_doc/_search
{
  "query":{
      "match_all": {}
  }
}
查询字段是否存在
GET /_search
{
    "query": {
        "exists" : { "field" : "user" }
    }
}
terms聚合–统计某个字段唯一值数量
GET mobilegateway-2019.06.18/_search
{
  "size": 0,
  "aggs": {
    "api": {
      "cardinality": {
        "field": "api.keyword"
      }
    }
  }
}

match 匹配(全文检索)

match_phrase精确查询

当数据类型为text时,使用match_phrase会精确查询

当数据类型为keyword时,使用match_phrase会逐字符查询取交集

match查询是一个标准查询,不管你需要全文本查询还是精确查询基本上都要用到它。

##此结果会查询索引为msd_recruiting_candidate的"postName" 字段包含"前"或"端"的数据
GET /msd_recruiting_candidate/_search
{
   "query": {
      "match": {
         "postName": "前端"
      }
   }
}
match_phrase&&sort匹配并排序
#查询索引为msd_recruiting_candidate的"postName" 字段包含精确匹配短语 "前端" 的文档,并按照 "candidateId" 字段进行升序排序。
GET /msd_recruiting_candidate/_search
{
   "query": {
      "match_phrase": {
         "postName": "前端"
      }
   },
   "sort": [
      {
         "candidateId": {
            "order": "asc"
         }
      }
   ]
}
查询排序分页
GET /msd_recruiting_candidate/_search
{
   "query": {
      "match": {
         "postName": "前端"
      }
   },
   "sort": [
      {
         "candidateId": {
            "order": "desc"
         }
      }
   ],
   "from": 0,
   "size": 2
}
#"from":0 #从第几个数据开始
#"size":2 #每页多少数据
_source 返回指定字段

_source后为数组,需要返回的字段

GET /msd_recruiting_candidate/_search
{
   "query": {
      "match_phrase": {
         "postName": "前端"
      }
   },
   "sort": [
      {
         "candidateId": {
            "order": "desc"
         }
      }
   ],
   "_source": ["candidateId","postName"]
}
条件查询 - query
bool - 用于构建复合查询的查询类型
must - 相当于mysql的and

所有的 must 子句都必须匹配才能返回文档

must_not - 相当于not

多个查询条件的相反匹配

should - 相当于or

至少有一个查询条件匹配

filter - 过滤器(bool下用)

用于在查询语句中指定一个或多个过滤条件的查询子句

range - 用于基于某个字段的范围进行过滤
# 过滤器将筛选出 "candidateId" 字段值在 7782 到 7784 之间(包括 7782 和 7784)的文档
"filter": [
            {
               "range": {
                  "candidateId": {
                     "gte": 7782,
                     "lte": 7784
                  }
               }
            }
         ]
exists - 用于筛选包含指定字段的文档

{ "exists": { "field": "field_name" }

prefix - 用于匹配某个字段以指定前缀开头的文档

{ "prefix": { "field": "prefix_value" } }

wildcard - 用于基于通配符模式匹配字段的值进行过滤

{ "wildcard": { "field": "value*" } }

regexp - 用于基于正则表达式匹配字段的值进行过滤

{ "regexp": { "field": "pattern" } }

geo_distance - 用于根据地理位置距离过滤文档

{ "geo_distance": { "distance": "1km", "location": { "lat": 40.7128, "lon": -74.0060 } } }

term - 用于精确匹配某个字段的值

{ "term": { "field": "value" } }

terms - 用于匹配字段值与指定的一个或多个值之一相等的文档

{ "terms": { "field": ["value1", "value2"] } }

#查询不等于** 并筛选candidateId在7782-7784范围内的数据
GET /msd_recruiting_candidate/_search
{
   "query": {
      "bool": {
         "must_not": [
            {
               "match": {
                  "candidateId": 16705
               }
            },
            {
               "match": {
                  "postId": "203"
               }
            }
         ],
         "filter": [
            {
               "range": {
                  "candidateId": {
                     "gte": 7782,
                     "lte": 7784
                  }
               }
            }
         ]
      }
   }
}

插入

使用 PUT /index/type/id

我们插入数据的时候,如果我们的语句中指明了index和type,如果ES里面不存在,默认帮我们自动创建

PUT /msd_recruiting_candidate/_doc/1
{
  "name":"zhangsan",
  "customer_full_name":{"firstname":"zhang","lastname":"san"},
  "gender":"man"
}

PUT /ecommerce/product/2
{
  "name":"隔壁老王",
  "customer_full_name":{"firstname":"wang","lastname":"wu"},
  "gender":"man"
}

# 也可以使用 POST
POST /ecommerce/product/1
{
  "name":"张三",
  "gender":"男"
}


# 如果使用 POST+update 方式,则只会更改对应的字段,其它字段不变,是局部更新;否则使用put或post方式将导致其它数据变化,数据全局更新。
POST /ecommerce/product/1/_update
{
  "doc":{
    "name":"张三"
  }
}

删除

DELETE /ecommerce/product/1
# 执行结果
{
  "_index" : "ecommerce",	#索引
  "_type" : "product",	#文档类型
  "_id" : "1",
  "_version" : 11,	#被删除的文档版本号,版本号是 Elasticsearch 内部用于处理并发操作的标识符。
  "result" : "deleted",	#"deleted":表示操作结果为 "deleted",即文档成功删除。
  "_shards" : {	#表示分片的信息,用于表示操作在分片级别的执行情况。
    "total" : 2,	#表示总共有 2 个分片
    "successful" : 1,	#表示成功执行的分片数为 1。这意味着删除操作只在一个分片上成功执行。
    "failed" : 0	#表示失败的分片数为 0,即没有执行失败的分片。
  },
  "_seq_no" : 11,	#表示操作的序列号为 11。序列号是 Elasticsearch 用于实现分布式写入一致性的内部标识符。
  "_primary_term" : 2	#表示操作的主要分片标识符为 2。主要分片是负责处理读取和写入操作的分片。
}

常见问题

集群yellow了怎么办

集群yellow,证明有副本分片未分配–unassigned

#查询集群健康状态
GET _cluster/health

#查询问题索引
GET _cat/indices?v&health=yellow

#查看钉钉告警,是否存在节点掉线等情况

#判断是否有节点掉线,ESPaas查看信息
GET _cat/nodes?v&h=http,v,Wj,dt,du,da,dup,hc,hp,hm,rc,rp,rm,m,sc,sm,siwm,svmm,l,name,r

#节点掉线,能重启
#ESPaas重启节点,等待节点上分片恢复

#节点掉线,不能重启
#如果急需副本恢复,设置delayed_timeout为0,后续再调整为24h
PUT /index_name/_settings
{
  "settings": {
    "index.unassigned.node_left.delayed_timeout": "0"
  }
}

#或区分片信息
GET _cat/shards?v

#分析分片未分配原因
GET _cluster/allocation/explain
#默认失败5次后不再进行分片分配,尝试重新进行索引分配
POST _cluster/reroute?retry_failed=true
集群red了该怎么办

集群red,证明存在主分片未分配,部分索引不能正常提供服务了;

一般主要是多个节点down掉导致的;

#查询集群健康状态
GET _cluster/health

#查询问题索引
GET _cat/indices?v&health=red
GET _cat/indices?v&health=yellow

#查看钉钉告警,是否存在节点掉线等情况,通过ESPaas重启节点,等待节点上分片恢复

#判断是否有节点掉线,ESPaas查看信息
GET _cat/nodes?v&h=http,v,Wj,dt,du,da,dup,hc,hp,hm,rc,rp,rm,m,sc,sm,siwm,svmm,l,name,r

#获取分片信息
GET _cat/shards?v

#分析分片未分配原因
GET _cluster/allocation/explain
#默认失败5次后不再进行分片分配,尝试重新进行索引分配
POST _cluster/reroute?retry_failed=true
集群查询相应很慢 慢查询!

分析慢查询的主要成因:

  • 查询语句或查询方式不合理,需要对查询语句进行调优,需要经验

    常见的有深度分页,查询频率过高,聚合查询不合理

  • 节点内存和cpu资源瓶颈,导致响应越来越慢

排查慢查询原因&解决

  • 集群是否是green状态,是否有节点掉线;
  • 查看jvm堆内存和gc情况
  • 查看机器load和cpu使用率
  • 查看索引监控,重点关注索引写入和索引查询是否存在飙升
  • 登录ES服务器,查看慢查询日志,业务查询方式/查询语句优化?
索引无法写入,报read only
  • 更改索引配置,解除索引只读
PUT _all/_settings
{
  "index.blocks.read_only_allow_delete": "false"
}
  • 临时措施
    • 降低不重要索引副本到0
    • 手动迁移索引分片
  • 永久措施
    • 删除不用的索引
    • 集群磁盘扩容(添加新节点/扩容当前节点磁盘)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值