惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MongoDB | Blog
MongoDB | Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
小众软件
小众软件
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - Franky
博客园 - 聂微东
V
Visual Studio Blog
I
InfoQ
罗磊的独立博客
Security Latest
Security Latest
G
Google Developers Blog
博客园_首页
P
Proofpoint News Feed
T
Threat Research - Cisco Blogs
D
DataBreaches.Net
PCI Perspectives
PCI Perspectives
Forbes - Security
Forbes - Security
P
Proofpoint News Feed
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Know Your Adversary
Know Your Adversary
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Recent Commits to openclaw:main
Recent Commits to openclaw:main
The Cloudflare Blog
AWS News Blog
AWS News Blog
Latest news
Latest news
T
Tailwind CSS Blog
P
Palo Alto Networks Blog
Hugging Face - Blog
Hugging Face - Blog
云风的 BLOG
云风的 BLOG
Cyberwarzone
Cyberwarzone
T
The Exploit Database - CXSecurity.com
WordPress大学
WordPress大学
Recorded Future
Recorded Future
A
Arctic Wolf
V
Vulnerabilities – Threatpost
Security Archives - TechRepublic
Security Archives - TechRepublic
宝玉的分享
宝玉的分享
人人都是产品经理
人人都是产品经理
月光博客
月光博客
有赞技术团队
有赞技术团队
P
Privacy & Cybersecurity Law Blog
Scott Helme
Scott Helme
美团技术团队
Hacker News - Newest:
Hacker News - Newest: "LLM"
Jina AI
Jina AI
N
News and Events Feed by Topic
Attack and Defense Labs
Attack and Defense Labs

博客园 - koushr

hls k8s常用命令 k8s 1.18.0安装 mysql json函数 group by的列、where的列的有效性 go基础第六篇:sync包 doris脚本 es veo ride nacos 枫叶互动 极光矩阵 富途 移卡科技 nginx高可用 k8s第一篇:k8s集群架构组件 架构设计第二篇:支付模块架构设计 可观测性体系设计第一篇:可观测性体系基本概念 架构设计第一篇:点赞模块功能设计 ES高级第一篇:倒排索引 山海星辰 python第一篇:基础语法 pulsar基础第二篇:命令行 pulsar基础第一篇:pulsar安装及基本概念 clickhouse第三篇:安装 clickhouse第二篇:MergeTree引擎 clickhouse第一篇:引擎 redis高阶第一篇:令牌桶算法限流 http2.0 gin入参多次获取 docker第二篇:docker安装常用中间件
es语法
koushr · 2026-04-27 · via 博客园 - koushr

创建索引(指定settings + mappings):

创建一个2个副本3个分片的索引,名字是user,有以下字段:

integer类型的age,keyword类型的name,keyword类型的gender,text类型的desc,date类型的birthday(格式要求型如2026-04-28 12:30:00),boolean类型的is_deleted

PUT user
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 2
  },
  "mappings": {
    "properties": {
      "age": {
        "type": "integer"
      },
      "name": {
        "type": "keyword"
      },
      "gender": {
        "type": "keyword"
      },
      "desc": {
        "type": "text"
      },
      "birthday": {
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss"
      },
      "is_deleted": {
        "type": "boolean"
      }
    }
  }
}

如果desc字段即想搜索,又想精确匹配,则

"desc": {
  "type": "text",
  "fields": {
    "keyword": {
      "type": "keyword"
    }
  }
}

插入:

不指定id:

POST /user/_doc

{
    "age": 60,
    "name": "王大拿",
    "gender": "male",
    "desc": "象牙山首富",
    "birthday": "1966-03-28 00:00:00",
    "is_deleted": false
}

指定id:

POST /user/_doc/1

{
    "age": 30,
    "name": "王小蒙",
    "gender": "female",
    "desc": "象牙山豆腐厂掌门人",
    "birthday": "1996-03-28 00:00:00",
    "is_deleted": false
}

批量插入:

POST /_bulk

{"index":{"_index":"user","_id":4,"_version":1}}
{"age":58,"name":"谢广坤","gender":"male","desc":"象牙山事逼","birthday":"1968-03-28 00:00:00","is_deleted":false}
{"index":{"_index":"user","_id":5,"_version":2}}
{"age":32,"name":"谢永强","gender":"male","desc":"王小蒙老公,怂比","birthday":"1994-03-28 00:00:00","is_deleted":false}

删除文档:

按id删:

DELETE /user/_doc/1

按条件删:

POST /user/_delete_by_query

{
    "query": {
        "term": {
            "age": 60
        }
    }
}

更改:

根据id=xxx更改,要使用_update

update user set age=56,birtdhay='1970-03-28 12:00:00' where id=4

POST /user/_update/4

{
	"doc": {
		"age": 56,
		"birthday": "1970-03-28 12:00:00"
	}
}

如果想不存在就插入,则使用doc_as_upsert

{
	"doc": {
		"age": 56,
		"birthday": "1970-03-28 12:00:00"
	},
	"doc_as_upsert": true
}

根据条件更新,要使用_update_by_query

update user set desc='象牙山一代目', is_deleted=true where age > 55

POST /user/_update_by_query

{
	"query": {
		"range": {
			"age": {
				"gt": 55
			}
		}
	},
	"script": {
		"source": "ctx._source.desc=params.desc; ctx._source.is_deleted=params.is_deleted",
		"params": {
			"desc": "象牙山一代目",
			"is_deleted": true
		}
	}
}

查询:

sql查询:

POST _sql?format=txt

{"query":"select * from user where gender = 'male'"}

非sql查询:

GET /user/_search

select * from user where age=18,用term query

{
    "query": {
        "term": {
            "age": 18
        }
    }
}

select * from user where age in (16,17,18),用terms query

{
    "query": {
        "terms": {
            "age": [
                16,
                17,
                18
            ]
        }
    }
}

select * from user where age>16 and age<18,用range query

{
    "query": {
        "range": {
            "age": {
                "gt": 16,
                "lt": 18
            }
        }
    }
}

select * from user where age!=18,用bool.must_not

{
    "query": {
        "bool": {
            "must_not": {
                "term": 18
            }
        }
    }
}

select * from user where age not in (16,17)

{
    "query": {
        "bool": {
            "must_not": {
                "terms": {
                    "age": [
                        16,
                        17
                    ]
                }
            }
        }
    }
}

select * from user where is_deleted=false and age=18,用bool.filter或者bool.must,前者不会计算score,会更快更省资源。filter是个json数组。

{
    "query": {
        "bool": {
            "filter": [
                {
                    "term": {
                        "is_deleted": false
                    }
                },
                {
                    "term": {
                        "age": 1
                    }
                }
            ]
        }
    }
}

select * from user where is_deleted=false and age>16 and age<18

{
    "query": {
        "bool": {
            "filter": [
                {
                    "term": {
                        "is_deleted": false
                    }
                },
                {
                    "range": {
                        "age": {
                            "gt": 16,
                            "lt": 18
                        }
                    }
                }
            ]
        }
    }
}

select * from user where age=18 and (is_deleted=false or gender='male')

and用bool.filter,or用bool.should,条件a or 条件b or 条件c,必须指定minimum_should_match为1。

{
    "query": {
        "bool": {
            "filter": [
                {
                    "term": {
                        "age": 18
                    }
                },
                {
                    "bool": {
                        "should": [
                            {
                                "term": {
                                    "is_deleted": false
                                }
                            },
                            {
                                "term": {
                                    "gender": male
                                }
                            }
                        ],
                        "minimum_should_match": 1
                    }
                }
            ]
        }
    }
}

bool对应的json结构体可以有4个属性,must、filter、should、must_not。must是必须满足,打分,等价于and。filter是必须满足,不打分,等价于and。should是可选,等价于or。must_not是必须不满足,等价于not。filter 是“要满足的条件集合”,must_not 是“要排除的条件集合”,两者是并列关系。

select * from user where A and B and not C

对应

{
  "bool": {
    "filter": [A, B],
    "must_not": [C]
  }
}

select * from user where name like '%张三%',模糊查询分词字段,用match

{
    "query": {
        "match": {
            "name": "张三"
        }
    }
}

select * from user order by age desc,用sort。sort和query关键字是同级的。因为可能有多个排序字段,所以sort是个数组

{
    "sort": [
        {
            "age": "desc"
        }
    ]
}

limit 0,10,用from、size,from、size和query关键字是同级的。

{
    "from": 0,
    "size": 10
}

select * from user where age = 18 and name in ('谢广坤','谢永强') and (is_deleted = false or gender = 'male') order by age desc limit 0,10

{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "age": 18
          }
        },
        {
          "terms": {
            "name": [
              '谢广坤',
              '谢永强'
            ]
          }
        },
        {
          "bool": {
            "should": [
              {
                "term": {
                  "is_deleted": false
                }
              },
              {
                "term": {
                  "gender": 'male'
                }
              }
            ],
            "minimum_should_match": 1
          }
        }
      ]
    }
  },
  "sort": [
    {
      "age": "desc"
    }
  ],
  "from": 0,
  "size": 10
}

select * from user where id not in (1,2,5) and age=18 and name in ('谢广坤','谢永强') and (is_deleted = false or gender = 'male') order by age desc limit 0,10

{
  "query": {
    "bool": {
      "must_not": {
        "terms": {
          "id": [
            1,
            2,
            5
          ]
        }
      },
      "filter": [
        {
          "term": {
            "age": 18
          }
        },
        {
          "terms": {
            "status": [
              0,
              1
            ]
          }
        },
        {
          "bool": {
            "should": [
              {
                "term": {
                  "deleted": 0
                }
              },
              {
                "term": {
                  "vip": 1
                }
              }
            ],
            "minimum_should_match": 1
          }
        }
      ]
    }
  },
  "sort": [
    {
      "age": "desc"
    }
  ],
  "from": 0,
  "size": 10
}

聚合语法:

select gender, count(1) from user group by gender

用aggs关键字,aggs与query同级。size=0表示不返回文档,只返回统计结果,否则会返回所有参与聚合的文档。

GET /user/_search

{
  "aggs": {
    "group_by_gender": {
      "terms": {
        "field": "gender"
      }
    }
  },
  "size": 0
}

select gender, count(1) from user where is_deleted=false group by gender,先过滤再聚合

{
  "size": 0,
  "query": {
    "term": {
      "is_deleted": false
    }
  },
  "aggs": {
    "group_by_gender": {
      "terms": {
        "field": "gender"
      }
    }
  }
}

select count(name), avg(age), max(age), min(age), sum(age) from xxx

{
  "size": 0,
  "aggs": {
    "count_name": {
      "value_count": {
        "field": "name"
      }
    },
    "avg_age": {
      "avg": {
        "field": "age"
      }
    },
    "max_age": {
      "max": {
        "field": "age"
      }
    },
    "min_age": {
      "min": {
        "field": "age"
      }
    },
    "sum_age": {
      "sum": {
        "field": "age"
      }
    }
  }
}

select gender, avg(age) from user group by gender,按性别分组,看各性别的平均年龄

{
  "size": 0,
  "aggs": {
    "group_by_gender": {
      "terms": {
        "field": "gender"
      },
      "aggs": {
        "avg_age": {
          "avg": {
            "field": "age"
          }
        }
      }
    }
  }
}

聚合比较难,可以用SQL Transalate API,让es告诉我们DSL怎么写。

POST /_sql/translate

{
  "query": "select gender, age, count(1) from user group by gender, age"
}

拿到DSL后,再去执行即可。 

在kibana console中,把光标放在命令后面,按ctrl+/,可以跳转到该命令的官方文档。在文档中,不仅可以看到该命令的语法,还能看到客户端api的使用。

image