ES 学习(十)DSL常用操作精简整理

目录

    • [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)、indexanalyzerproperties(子字段)。

分片公式:总分片数 = 主分片数 + 副本数 × 主分片数;单分片建议 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 只需一行)。

整理完毕,完结撒花~ 🌻