目录
-
- [1. 索引](#1. 索引)
- [2. 文档](#2. 文档)
- [3. DSL 查询](#3. DSL 查询)
- [4. 聚合](#4. 聚合)
- [5. 性能与批量](#5. 性能与批量)
适用 ES 版本:6.x | 在线 SQL 转 ES:https://old.printlove.cn/tools/sql2es
1. 索引
创建索引:
PUT /索引名称
json
{
"settings": { "number_of_shards": 5, "number_of_replicas": 1 },
"mappings": {
"_doc": {
"properties": {
"title": { "type": "text", "analyzer": "ik_smart" },
"status": { "type": "keyword" },
"price": { "type": "float" },
"publish_date": { "type": "date" }
}
}
}
}
Mapping 常用属性:type(text/keyword/long/date/object)、index、analyzer、properties(子字段)。
分片公式:总分片数 = 主分片数 + 副本数 × 主分片数;单分片建议 10--50GB,生产环境副本至少 1。
查看全部索引:
GET /_cat/indices?v
以表格形式列出集群中所有索引;加 h=index,health,status,docs.count,store.size 可指定列。
查看全部索引(按占用空间倒序):
GET /_cat/indices?v&s=store.size:desc
按 store.size 从大到小排列,便于排查占用空间最大的索引。
查看索引设置:
GET /索引名称/_settings
查看索引映射:
GET /索引名称/_mapping
查看索引统计:
GET /索引名称/_stats
更新副本数:
PUT /索引名称/_settings
json
{ "number_of_replicas": 2 }
添加新字段映射:
PUT /索引名称/_mapping/_doc
json
{ "properties": { "tags": { "type": "keyword" } } }
生产注意:可添加新字段、可改副本数;不可改已有字段类型、不可删已有字段。
删除索引:
DELETE /索引名称
2. 文档
指定 ID 创建文档:
PUT /索引名称/_doc/{id}
ID 已存在则覆盖更新。
自动生成 ID 创建文档:
POST /索引名称/_doc
根据 ID 查询文档:
GET /索引名称/_doc/{id}
批量获取文档:
POST /索引名称/_mget
json
{ "docs": [ { "_id": "1" }, { "_id": "2" } ] }
查询全部文档:
POST /索引名称/_search
json
{ "query": { "match_all": {} }, "size": 1000 }
全量更新文档:
PUT /索引名称/_doc/{id}
需提供完整文档内容。
部分更新文档:
POST /索引名称/_doc/{id}/_update
json
{ "doc": { "price": 7599 } }
脚本更新文档:
POST /索引名称/_update/{id}
json
{ "script": "ctx._source.price += 1" }
删除单个文档:
DELETE /索引名称/_doc/{id}
按条件批量删除:
POST /索引名称/_delete_by_query
json
{ "query": { "match": { "status": "draft" } } }
3. DSL 查询
统一请求:
POST /索引名称/_search,查询条件放在请求体query对象中。
分词查询(match):
{ "query": { "match": { "title": "iPhone" } } }
全文搜索,会对查询文本分词。
精确查询(term):
{ "query": { "term": { "status": { "value": "published" } } } }
精确匹配,不分词,适用于 keyword 字段;text 字段需用 字段名.keyword。
布尔组合(bool):
{ "query": { "bool": { "must": ..., "filter": ..., "must_not": ..., "should": ... } } }
must:必须满足且参与评分;filter:过滤不参与评分可缓存;must_not:必须不满足;should:或条件。
范围查询(range):
{ "query": { "range": { "price": { "gte": 5000, "lte": 6000 } } } }
gte/lte/gt/lt:大于等于/小于等于/大于/小于。
日期范围查询:
{ "query": { "range": { "publish_date": { "gte": "2025-01-10", "lt": "2025-01-10||+7d" } } } }
短语查询(match_phrase):
{ "query": { "match_phrase": { "title": "iPhone 15" } } }
分词后词项须按顺序连续出现。
多字段查询(multi_match):
{ "query": { "multi_match": { "query": "iPhone", "fields": "title", "desc" } } }
match 全词匹配(operator):
{ "query": { "match": { "title": { "query": "iPhone 15", "operator": "and" } } } }
operator: and 表示所有分词都必须匹配。
函数评分(function_score):
{ "query": { "function_score": { "query": { "match": { "title": "iPhone" } }, "functions": ..., "boost_mode": "multiply" } } }
通配符查询(wildcard):
{ "query": { "wildcard": { "status": { "value": "p*d" } } } }
* 匹配任意字符序列,? 匹配单个字符;不可直接用于 text 类型。
前缀查询(prefix):
{ "query": { "prefix": { "status": { "value": "p" } } } }
模糊查询(fuzzy):
{ "query": { "fuzzy": { "title": { "value": "iPhne", "fuzziness": 2, "prefix_length": 1 } } } }
基于编辑距离匹配;fuzziness 为允许的最大编辑次数。
查询字符串(query_string):
{ "query": { "query_string": { "query": "title:(iPhone OR 15) AND status:published" } } }
支持 Lucene 语法:AND、OR、NOT 等。
4. 聚合
聚合条件放在请求体
aggs对象中,可与query组合使用。
求和(sum):
{ "aggs": { "total_price": { "sum": { "field": "price" } } } }
平均值(avg):
{ "aggs": { "avg_price": { "avg": { "field": "price" } } } }
词条分组(terms):
{ "aggs": { "group_by_status": { "terms": { "field": "status" } } } }
按字段值分组统计文档数量。
数值直方图(histogram):
{ "aggs": { "price_ranges": { "histogram": { "field": "price", "interval": 1000 } } } }
日期直方图(date_histogram):
{ "aggs": { "sales_over_time": { "date_histogram": { "field": "publish_date", "interval": "month" } } } }
5. 性能与批量
Filter 上下文(无评分、可缓存):
{ "query": { "bool": { "filter": { "range": { "publish_date": { "gte": "2023-01-01" } } } } } }
不需要相关性评分时,优先用 filter 替代 must。
浅分页(from/size):
{ "from": 0, "size": 10, "query": { "match_all": {} } }
适用于前几页;深分页性能差。
滚动查询初始化(scroll):
POST /索引名称/_search?scroll=1m
json
{ "size": 1000, "query": { "match_all": {} } }
滚动获取下一批:
GET /_search/scroll
json
{ "scroll": "1m", "scroll_id": "上一步返回的 scroll_id" }
适用于深分页或全量导出。
批量操作(bulk):
POST /_bulk
{ "index": { "_index": "products", "_id": "1" } }
{ "title": "Product A", "price": 100 }
{ "delete": { "_index": "products", "_id": "3" } }
每两行一组:第一行元数据,第二行文档内容(delete 只需一行)。
整理完毕,完结撒花~ 🌻