🧰 Elasticsearch 常用语法手册
📚 目录
🔹 索引操作
查询全部索引
GET _search
创建索引
PUT /es_db
创建索引并设置分片数和副本数
PUT /es_db
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 2
}
}
查询索引是否存在
HEAD /es_db
查询索引详情
GET /es_db
删除索引
DELETE /es_db
修改索引配置(如副本数)
PUT /es_db/_settings
{
"index": {
"number_of_replicas": 1
}
}
添加 IK 分词器
PUT /es_db
{
"settings": {
"index.analysis.analyzer.default.type": "ik_max_word"
}
}
🔹 文档操作
添加文档
PUT /es_db/_doc/1
{
"name": "张三",
"age": 10,
"address": "深圳市宝安区海谷科技大厦"
}
查询文档
GET /es_db/_search
局部更新文档
POST /es_db/_update/5
{
"doc": {
"age": 22
}
}
删除文档
DELETE /es_db/_doc/5
🔹 查询操作
条件查询(match)
GET /es_db/_search
{
"from": 0,
"size": 20,
"query": {
"match": {
"name": "张三"
}
}
}
条件查询(q 参数)
GET /es_db/_search?q=name:庆
短语匹配查询(match_phrase)
POST /es_db/_search
{
"query": {
"match_phrase": {
"name": "张三"
}
}
}
使用过滤器查询(post_filter)
GET /es_db/_search
{
"query": {
"match_all": {}
},
"post_filter": {
"range": {
"age": {
"gte": 10,
"lte": 20
}
}
}
}
高亮显示
POST /es_db/_search
{
"query": {
"match_phrase": {
"name": "张三"
}
},
"highlight": {
"fields": {
"name": {}
}
}
}
🔹 聚合查询
terms 聚合(按字段统计)
GET /es_db/_search
{
"query": { "match_all": {} },
"aggs": {
"name": {
"terms": {
"field": "address.keyword"
}
}
}
}
⚠️ 注意:
text
类型字段不能直接用于聚合,需使用.keyword
子字段或开启fielddata=true
(占用较多内存)
avg 聚合(求平均值)
GET /es_db/_search
{
"query": { "match_all": {} },
"aggs": {
"name": {
"avg": {
"field": "age"
}
}
}
}
🔹 健康与状态查看
查看集群健康状态
GET _cat/health
查看索引情况
GET _cat/indices?v
❗ 常见问题与注意事项
text vs keyword
text
类型适合全文搜索,会进行分词。keyword
类型不会分词,适合精确匹配、排序、聚合等操作。- 如果需要对
text
字段进行排序或聚合,可以:- 使用
.keyword
子字段; - 或在映射中设置
"fielddata": true
,但注意内存消耗较大。
- 使用
示例字段映射
PUT /es_db
{
"mappings": {
"properties": {
"address": {
"type": "text",
"fields": {
"keyword": { "type": "keyword" }
}
}
}
}
}
排序 + 分页查询示例
GET /es_db/_search
{
"from": 0,
"size": 10,
"query": {
"bool": {
"must": [
{ "match": { "name": "张三" } }
],
"filter": [
{ "range": { "age": { "gte": 18 } } }
]
}
},
"sort": [
{ "createTime": "desc" }
]
}