本文记录一些 es 的基础查询。
目录
_cat系列
所有命令后面的 "?v" 可不加,加了的话可以显示列名等信息。
# 检查集群健康状态
GET /_cat/health?v
# 查看节点信息
GET /_cat/nodes?v
# 查看索引信息
GET /_cat/indices?v
# 显示为索引配置的别名,包含过滤器、路由信息等
GET /_cat/aliases?v
# 显示每个节点分片的数量以及硬盘空间使用的情况
GET /_cat/allocation?v
# 显示master的IP和所在节点
GET /_cat/master?v
# 显示节点信息
GET /_cat/nodes?v
# 详细的描述了节点包含的分片信息
GET /_cat/shards?v
常用字段类型
在创建索引、文档前,有必要先了解下es中常用的字段类型
类型名称 | 包含种类 | 说明 |
字符串 | text:用于全文索引,搜索时会自动使用分词器进行分词再匹配 keyword:不分词,搜索时需要匹配完整的值 | |
数值 | 整型:byte、short、integer、long 浮点型:float、double | |
日期 | date | 额外参数 format:对日期进行格式化。 例如:"yyyy-MM-dd HH:mm:ss" |
范围 | integer_range、long_range、float_range、double_range、date_range | 在插入/更新文档时,字段需要使用 json 形式 |
布尔 | true、false | |
其他 | 如对象、数组、ip等 |
操作索引 Index
# 【结构化】创建索引book,设定mappings、settings。
# 并给两个text类型的字段,设置ik分词器
PUT /book
{
"settings":{
"number_of_shards": 1,
"number_of_replicas": 1
},
"mappings":{
"properties":{
"author":{
"type": "keyword"
},
"title":{
"type": "text",
"analyzer": "ik_max_word", "search_analyzer": "ik_smart"
},
"description":{
"type": "text",
"analyzer": "ik_max_word", "search_analyzer": "ik_smart"
},
"price":{
"type": "double"
},
"words":{
"type": "integer"
},
"publish_date":{
"type": "date",
"format": "yyyy-MM-dd"
},
"is_deleted":{
"type": "boolean"
}
}
}
}
# 删除索引
DELETE /book
# 查询索引信息,返回结果包含aliases、mappings、settings
GET /book
# 查看索引的mapping信息
GET /book/_mapping
# 查看索引的setting信息,里面包含了索引的分区数、副本数、创建时间等信息
GET /book/_settings
# 查看索引统计信息,包含文档数、占用存储空间等
GET /book/_stats
操作文档 Document
文档的增删改操作
操作文档的时候路径中需要增加 “_doc”!
# 一、创建文档。指定ID,可重复创建,会覆盖
PUT /book/_doc/5/
{
"author":"丸山黄金",
"title":"overlord 14卷",
"description":"灭国的魔女",
"price":"57",
"word":1210000,
"publish_date":"2019-08-20",
"is_deleted":false
}
# 不可重复创建,当ID存在时会报错
POST /book/_doc/3/_create
{
"author":"xjy",
"title":"spring ioc源码",
"price":"20",
"word":42000
}
# 自动生成ID
POST /book/_doc
{
"title":"Redis深度解析"
}
# 修改文档,可以使用POST或PUT
# PUT全量更新,写法跟创建一样。ID存在就是更新
PUT /book/_doc/1
{
"author":"xujingyi",
"price":20.5
}
# POST增量更新,必须要使用 POST 和 "_update"
POST /book/_doc/1/_update
{
"doc":{
"title":"Reids",
"price":34.5
}
}
# 按条件删除
POST /prometheusbeat-7.3.1/_delete_by_query
{
"query": {
"range": {
"@timestamp": {
"gte": "2021-09-15 08:41:00",
"lte": "2021-09-15 08:42:00",
"format": "yyyy-MM-dd HH:mm:ss"
}
}
}
}
analize分析
# 分析字段的分词情况等
GET /book/_analyze
{
"field": "title",
"text": "Springboot源码解析"
}
基本查询
# 查询文档总数
GET /book/_count
# 一、主键查询
GET /book/_doc/1
# 根据ID列表查询,也可以是/book/_doc/_mget
GET /book/_mget
{
"ids":[1,2]
}
# 查询全部
GET /book/_search
GET /book/_search
{
"query": {
"match_all": {}
}
}
# 单个条件模糊查询 match
GET /book/_search
{
"query": {
"match": {
"title": "spring源码"
}
}
}
# 普通match查询
GET /book/_search
{
"query": {
"match": {
"title": {
"query": "spring源码"
}
}
}
}
# 查询大于某个时间区间的数据
GET /prometheusbeat-7.3.1/_search
{
"query": {
"range": {
"@timestamp": {
"gte": "2021-09-15 08:36:00",
"lte": "now",
"format": "yyyy-MM-dd HH:mm:ss"
}
}
}
}
# 按复杂对象(json)中的字段进行查询
GET /prometheusbeat-7.3.1/_search
{
"query": {
"match": {
"labels.job": "kube-state-metrics"
}
}
}
# 必须要有 minimum_should_match 个关键词匹配,才能查出来
GET /book/_search
{
"query": {
"match": {
"title": {
"query": "mybatis源码",
"minimum_should_match": 2
}
}
}
}
# 单个条件模糊查询,并限制返回的字段 _source
GET /book/_search
{
"query": {
"match": {
"author": "丸山黄金"
}
},
"_source": "title"
}
# 精确查找 term
# 注意:term用于数字、日期、keyword等类型时没问题,但是对于text类型,只能匹配到分词
GET /book/_search
{
"query": {
"term": {
"price": "55"
}
}
}
# 多个字段中只要有一个跟搜索的字段匹配 multi_match
GET /book/_search
{
"query": {
"multi_match": {
"query": "骑士",
"fields":["title","description"]
}
}
}
# 给multi_match设置字段权重
GET /book/_search
{
"query": {
"multi_match": {
"query": "骑士",
"fields":["title^2","description"],
"tie_breaker": 0.3
}
}
}
# 一个字段中必须包含指定的多个分词
GET /book/_search
{
"query": {
"query_string": {
"default_field": "title",
"query": "ioc AND 源码"
}
}
}
# 分页查询 from & size
GET /book/_search
{
"query": {
"match_all": {}
},
"from": 0,
"size": 2
}
# 排序 sort
GET /book/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"price": {
"order": "desc"
}
}
]
}
bool查询(多条件查询)
# 多条件查询 AND 效果,使用 must
GET /book/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"title": "spring"
}
},{
"match": {
"description": "aop"
}
}
]
}
}
}
# 多条件查询 OR 效果,使用 should
GET /book/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"title": "spring"
}
},{
"match": {
"description": "aop"
}
}
]
}
}
}
# 查询的结果必须【不包含】指定的条件
GET /book/_search
{
"query": {
"bool": {
"must_not": [
{
"match": {
"title": "spring"
}
}
]
}
}
}
# 范围查询 filter。可以和must与should结合使用。
# 不过要注意如何和should一起使用,当should没匹配时,filter仍然会发挥作用!
# gte和lte可以分开使用,以达到查询大于某值或者小于某值的效果
GET /book/_search
{
"query": {
"bool": {
"filter": [
{
"range": {
"price": {
"gte": 50,
"lte": 60
}
}
}
]
}
}
}
# constant_score也可以配合filter使用,
# filter正常不会返回sorce,跟constant_score结合使用时,可以返回boost指定的score
# 注意:这里跟bool方式写法上有个不同点是,这里filter只有一个,而bool方式是一个数组
GET /book/_search
{
"query": {
"constant_score": {
"filter": {
"range": {
"price": {
"gte": 50,
"lte": 60
}
}
},
"boost": 1.2
}
}
}
聚合查询
聚合查询类似于 mysql 中的 group by 以及一些函数,比如 sum、avg 等。
# 查询一个字段的最大值[max]。[min、avg、sum]也是同样用法
# 可以跟query结合使用,先过滤一部分数组,再做聚合!
GET /book/_search
{
"aggs": {
"max_price": {
"max": {
"field": "price"
}
}
}
}
# 文档中某个值的个数 [value_count],一般和其他聚合结合使用
GET /book/_search
{
"aggs": {
"price_count":{
"value_count": {
"field": "price"
}
}
}
}
# 计算文档中某个字段值的非重复个数。注意返回的是个数。[cardinality]
GET /book/_search
{
"aggs": {
"price_distinct":{
"cardinality": {
"field": "price"
}
}
}
}
# 计算某个字段的统计数据,返回它的[count、min、max、avg、sum]数值。[stats]
GET /book/_search
{
"aggs": {
"price_stats":{
"stats": {
"field": "price"
}
}
}
}
# 根据某个字段进行分组,会返回组内元素的个数。 [terms]
GET /book/_search
{
"aggs": {
"author_terms":{
"terms": {
"field": "author",
"size": 10
}
}
}
}
# 和query结合使用,过滤后再做聚合
GET /book/_search
{
"query": {
"match": {
"description": "好汉"
}
},
"aggs": {
"author_terms":{
"terms": {
"field": "author",
"size": 5
}
}
}
}
# 过滤聚合(filter Aggregation)
# 通常这将用于将当前聚合上下文缩小到一组特定的文档
GET /book/_search
{
"aggs": {
"author_terms": {
"filter": {
"match": {
"title": "spring"
}
},
"aggs": {
"price_terms": {
"avg": {
"field": "price"
}
}
}
}
}
}
# 范围聚合(Range Aggregation) [range]
GET /book/_search
{
"aggs": {
"price_ranges":{
"range": {
"field": "price",
"ranges": [
{ "to": 50 },
{ "from": 50, "to": 100 },
{ "from": 100 }
]
}
}
}
}
# 时间范围聚合(Date Range Aggregation) [date_range]
GET /book/_search
{
"aggs": {
"publish_date_range":{
"date_range": {
"field": "publish_date",
"ranges": [
{ "to": "2017-08-20"},
{ "from": "2017-08-20", "to": "2019-08-20"},
{ "from": "2019-08-20"}
]
}
}
}
}
# 按某查询条件查询,然后group by,最后sum
GET /prometheusbeat-7.3.1/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "container_cpu_usage_seconds_total"
}
},
{
"match": {
"labels.container": "train-py-test"
}
}
]
}
},
"aggs": {
"group_by_time":{
"terms": {
"field": "@timestamp",
"size": 100
}
,"aggs": {
"value_sum": {
"sum": {
"field": "value"
}
}
}
}
}
}
# 聚合后按照原字段排序 [_term]
GET /prometheusbeat-7.3.1/_search
{
"aggs": {
"group_by_time":{
"terms": {
"field": "@timestamp",
"order": {
"_term": "asc"
},
"size": 100
}
,"aggs": {
"value_sum": {
"sum": {
"field": "value"
}
}
}
}
}
}
# 聚合后按照计算出来的字段排序
GET /prometheusbeat-7.3.1/_search
{
"aggs": {
"group_by_time":{
"terms": {
"field": "@timestamp",
"order": {
"value_sum": "asc"
},
"size": 100
}
,"aggs": {
"value_sum": {
"sum": {
"field": "value"
}
}
}
}
}
}
先记到这吧,持续补充。。。。