Kibana

什么是kibana?

Kibana 是一个免费且开放的用户界面,能够让您对 Elasticsearch 数据进行可视化,并让您在 Elastic Stack 中进行导航。您可以进行各种操作,从跟踪查询负载,到理解请求如何流经您的整个应用,都能轻松完成。

docker运行kibana

直接运行:

# 本地没有镜像会自动下载
docker run -d --name kibana  -p 5601:5601 kibana:tag

修改连接es的地址
进入容器,config/kibana.yml,修改地址重启即可
启动完成后访问:
ip:5601
汉化

# 进入容器
docker exec -it 容器id   /bin/bash
# 修改配置文件
cd config
vi kibana.yml
# 添加一行
i18n.locale: zh-CN
# 保存,重启容器即可

Kibana_第1张图片

点击控制台操作es

# 查询具体点的某一个文档
GET shop/_doc/1001
# 根据条件查询文档
GET /shop/_search
{
     
  "query": {
     
    "match": {
     
      "nickname": "gamexbox"
    }
  }
}

GET /shop/_search
{
     
  "query": {
     
    "match": {
     
      "nickname": "gamexbox"
    }
  }
}

# 排序
GET /shop/_search
{
     
  "query": {
     
    "match": {
     
      "desc": "慕课网"
    }
  },
  "sort": [
    {
     
      "age": {
     
        "order": "desc"
      }
    }
  ]
}

分页查询

GET /shop/_search
{
     
  "query": {
     
    "match": {
     
      "desc": "慕课网"
    }
  },
  "sort": [
    {
     
      "age": {
     
        "order": "desc"
      }
    }
  ],
  # 相当于MySQL的pageNum和pageSize
  "from": 0,
  "size": 2
}

bool查询

# must:相当于and
GET /shop/_search
{
     
  "query": {
     
    "bool": {
     
      "must": [
        {
     
          "match": {
     
          "desc": "慕课网"
          }
        },
        {
     
          "match": {
     
            "nickname": "水中鱼"
          }
        }
      ]
    }
  }
}
# should,相当于or
GET /shop/_search
{
     
  "query": {
     
    "bool": {
     
      "should": [
        {
     
          "match": {
     
          "desc": "慕课网"
          }
        },
        {
     
          "match": {
     
            "nickname": "水中鱼"
          }
        }
      ]
    }
  }
}
# must_not 和must取反
GET /shop/_search
{
     
  "query": {
     
    "bool": {
     
      "must_not": [
        {
     
          "match": {
     
          "desc": "慕课网"
          }
        },
        {
     
          "match": {
     
            "nickname": "水中鱼"
          }
        }
      ]
    }
  }
}

过滤查询

1:bool里边的过滤查询

GET /shop/_search
{
     
  "query": {
     
    "bool": {
     
      "must_not": [
        {
     
          "match": {
     
          "desc": "慕课网"
          }
        },
        {
     
          "match": {
     
            "nickname": "水中鱼"
          }
        }
      ],
      "filter": [
        {
     
          "range": {
     
            "age": {
     
              "gte": 10,
              "lte": 25
            }
          }
        }
      ]
    }
  }
}

注意:如果should和filter或者must在同一级的时候,默认should是不起作用的。这个时候需要用到minimum_should_match =1:表示should中至少要满足一项

GET /shop/_search
{
     
  "query": {
     
    "bool": {
     
      "should": [
        {
     
          "match": {
     
          "desc": "慕课网"
          }
        },
        {
     
          "match": {
     
            "nickname": "水中鱼"
          }
        }
      ],
      "filter": [
        {
     "range": {
     
          "age": {
     
            "gte": 20,
            "lte": 23
          }
        }}
      ],
      # 为了让should中满足一项
      "minimum_should_match": 1
    }
  }
}

2 :bool外边的过滤查询

post_filter是一个顶级元素

GET /shop/_search
{
     
  "query": {
     
    "bool": {
     
      "should": [
        {
     
          "match": {
     
            "desc": {
     
              "query": "慕课网"
            }
          }
        },
        {
     
          "match": {
     
            "desc": {
     
              "query": "律师",
              "boost": 100
            }
          }
        }
      ]
    }
  },
  # 是对已经查询出来的数据进行过滤
  "post_filter": {
     
  # 不只是range,还有term,terms等
    "range": {
     
      "money": {
     
        "gte": 88.5,
        "lte": 2000
      }
    }
  }, 
  "_source": [
      "id","nickname","desc","money"
    ]
}

term精确查询

term和match的区别:match会对查询的key进行分词,二term不会,比如:查询的key是 中国
match就会分词成 and 等,而term就不会对中国进行分词。

GET /shop/_search
{
     
  "query": {
     
    "bool": {
     
      "should": [
        {
     
          "term": {
     
          "desc": "慕课网"
          }
        },
        {
     
          "term": {
     
            "nickname": "水中鱼"
          }
        }
      ],
      "filter": [
        {
     "range": {
     
          "age": {
     
            "gte": 20,
            "lte": 23
          }
        }}
      ],
      # minimum_should_match:最低精度匹配,值还可以是百分数
      "minimum_should_match": 1
    }
  }
}

# 多个精确匹配,用terms
GET /shop/_search
{
     
  "query": {
     
    "terms": {
     
      "desc": ["慕课网","学习","骚年"]
    }
  }
}

多个条件匹配

空格隔开就行

GET /shop/_search
{
     
  "query": {
     
    "match": {
     
      "desc": "慕课网 我是"
    }
  }
}

高亮

GET /shop/_search
# 标签自定义
{
     
  "query": {
     
    "match": {
     
      "desc": "慕课网"
    }
  },
  "highlight": {
     
    "pre_tags": "

", "post_tags": "

"
, "fields": { "desc": { } } } }

效果
Kibana_第2张图片

operator查询

GET /shop/_search
{
     
  "query": {
     
    "match": {
     
      "desc": "慕课网"
    }
  }
}
# 等同于
GET /shop/_search
{
     
  "query": {
     
    "match": {
     
      "desc": {
     
        "query": "慕课网",
        # operator的默认值就是or,还可以是and,如果是and,则目标数据就必须包含query分词后的数据
        "operator": "or"
      }
    }
  }
}

ids查询

GET /shop/_search
{
     
  "query": {
     
    "ids": {
     
      "type": "_doc",
      "values": ["1001","1003"]
    }
  },
  "_source": [
      "id","nickname","desc"
    ]
}

mget批量查询

GET /shop/_doc/_mget
{
     
  "ids":[
      "1001","10054"
    ]
}

mget查询结果集

# mget查询结果集
{
     
  "docs" : [
    {
     
      "_index" : "shop",
      "_type" : "_doc",
      "_id" : "1001",
      "_version" : 2,
      "_seq_no" : 7,
      "_primary_term" : 3,
      "found" : true,
      "_source" : {
     
        "id" : 1001,
        "age" : 18,
        "username" : "imoocAmazing",
        "nickname" : "慕课网",
        "money" : 88.8,
        "desc" : "我在慕课网学习java和前端,学习到了很多知识",
        "sex" : 0,
        "birthday" : "1992-12-24",
        "face" : "https://www.imooc.com/static/img/index/logo.png"
      }
    },
    # 如果没有查询:found=false,也可以以此来判断某个文档是否存在于索引中
    {
     
      "_index" : "shop",
      "_type" : "_doc",
      "_id" : "10054",
      "found" : false
    }
  ]
}

multi_match查询:同时查询多个字段

# 同时查询desc和nickname,
GET /shop/_search
{
     
  "query": {
     
    "multi_match": {
     
      "query": "帕克慕课网",
      "fields": ["desc","nickname"]
    }
  },
  "_source": [
      "id","nickname","desc"
    ]
}
#boost 权重,为某个字段设置权重,权重越高,文档相关性得分就越高。通畅来说搜索商品名称要比商品简介的权重更高。
GET /shop/_search
{
     
  "query": {
     
    "multi_match": {
     
      "query": "帕克慕课网",
      # 提升权重符号 ^符号:shift+6
      "fields": ["desc","nickname^10"]
    }
  },
  "_source": [
      "id","nickname","desc"
    ]
}

为某一个词做权重查询

GET /shop/_search
{
     
  "query": {
     
    "bool": {
     
      "should": [
        {
     
          "match": {
     
            "desc": {
     
              "query": "慕课网"
            }
          }
        },
        {
     
          "match": {
     
            "desc": {
     
              "query": "律师",
              # boost:后边跟数字,加权
              "boost": 100
            }
          }
        }
      ]
    }
  },
  "_source": [
      "id","nickname","desc"
    ]
}

深度分页

深度分页其实就是搜索的深浅度,比如第1页,第2页,第10页,第20页,是比较浅的;第10000页,第20000页就是很深了。
加入是三个分片
我们在获取第9999条到10009条数据的时候,其实每个分片都会拿到10009条数据,然后集合在一起,总共是10009*3=30027条数据,针对30027数据再次做排序处理,最终会获取最后10条数据。

如此一来,搜索得太深,就会造成性能问题,会耗费内存和占用cpu。而且es为了性能,他不支持超过一万条数据以上的分页查询。那么如何解决深度分页带来的性能呢?其实我们应该避免深度分页操作(限制分页页数),比如最多只能提供100页的展示,从第101页开始就没了,毕竟用户也不会搜的那么深,我们平时搜索淘宝或者百度,一般也就看个10来页就顶多了。

手动设置深度分页的值

PUT     /shop/_settings
{
      
    "index.max_result_window": "20000"
}

scroll滚动搜索(游标搜索)官方地址

一次性查询1万+数据,往往会造成性能影响,因为数据量太多了。这个时候可以使用滚动搜索,也就是 scroll。滚动搜索可以先查询出一些数据,然后再紧接着依次往下查询。在第一次查询的时候会有一个滚动id,相当于一个锚标记,随后再次滚动搜索会需要上一次搜索的锚标记,根据这个进行下一次的搜索请求。每次搜索都是基于一个历史的数据快照,查询数据的期间,如果有数据变更,那么和搜索是没有关系的,搜索的内容还是快照中的数据。

1:滚动搜索要先初始化

# scroll=1m 相当于是一个session会话时间,搜索保持的上下文时间为1分钟。一分钟之内,返回的scroll_id都是有效的
GET  /shop/_search?scroll=1m
{
     
    "query": {
      
    	"match_all": {
     
    	}
    },  
    # "sort" : ["_doc"] 固定写法
    "sort" : ["_doc"], 
    "size": 10000
}
# 之后的查询
GET   /_search/scroll
{
     
    "scroll": "1m", 
    # 上一次查询返回的scroll_id
    "scroll_id" : "your last scroll_id"
}

批量操作 bulk

基本语法
bulk操作和以往的普通请求格式有区别。不要格式化json,不然就不在同一行了,这个需要注意。

{
      action: {
      metadata }}\n
{
      request body        }\n
{
      action: {
      metadata }}\n
{
      request body        }\n
...

{ action: { metadata }}代表批量操作的类型,可以是新增、删除或修改
\n是每行结尾必须填写的一个规范,每一行包括最后一行都要写,用于es的解析
{ request body }是请求body,增加和修改操作需要,删除操作则不需要
批量操作的类型
action 必须是以下选项之一:

create:如果文档不存在,那么就创建它。存在会报错。发生异常报错不会影响其他操作。
index:创建一个新文档或者替换一个现有的文档。
update:部分更新一个文档。
delete:删除一个文档。
metadata 中需要指定要操作的文档的_index 、 _type 和 _id,_index 、 _type也可以在url中指定

实操
create新增文档数据,在metadata中指定index以及type

POST    /_bulk
{
     "create": {
     "_index": "shop2", "_type": "_doc", "_id": "2001"}}
{
     "id": "2001", "nickname": "name2001"}
{
     "create": {
     "_index": "shop2", "_type": "_doc", "_id": "2002"}}
{
     "id": "2002", "nickname": "name2002"}
{
     "create": {
     "_index": "shop2", "_type": "_doc", "_id": "2003"}}
{
     "id": "2003", "nickname": "name2003"}

create创建已有id文档,在url中指定index和type

POST /shop/_doc/_bulk

{
     "create": {
     "_id": "2003"}}
{
     "id": "2003", "nickname": "name2003"}
{
     "create": {
     "_id": "2004"}}
{
     "id": "2004", "nickname": "name2004"}
{
     "create": {
     "_id": "2005"}}
{
     "id": "2005", "nickname": "name2005"}

index创建,已有文档id会被覆盖,不存在的id则新增

POST /shop/_doc/_bulk

{
     "index": {
     "_id": "2004"}}
{
     "id": "2004", "nickname": "index2004"}
{
     "index": {
     "_id": "2007"}}
{
     "id": "2007", "nickname": "name2007"}
{
     "index": {
     "_id": "2008"}}
{
     "id": "2008", "nickname": "name2008"}

update跟新部分文档数据

POST    /shop/_doc/_bulk
{
     "update": {
     "_id": "2004"}}
{
     "doc":{
      "id": "3004"}}
{
     "update": {
     "_id": "2007"}}
{
     "doc":{
      "nickname": "nameupdate"}}

delete批量删除

POST    /shop/_doc/_bulk
{
     "delete": {
     "_id": "2004"}}
{
     "delete": {
     "_id": "2007"}}

综合批量各种操作

POST    /shop/_doc/_bulk
{
     "create": {
     "_id": "8001"}}
{
     "id": "8001", "nickname": "name8001"}
{
     "update": {
     "_id": "2001"}}
{
     "doc":{
      "id": "20010"}}
{
     "delete": {
     "_id": "2003"}}
{
     "delete": {
     "_id": "2005"}}

官方文档

你可能感兴趣的:(kibana操作es,es的语法,elasticsearch)