文章目录
查询返回字段解析
{
"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
- 手动迁移索引分片
- 永久措施
- 删除不用的索引
- 集群磁盘扩容(添加新节点/扩容当前节点磁盘)