Elasticsearch常用DSL快速查询指南

发布于:2025-09-03 ⋅ 阅读:(18) ⋅ 点赞:(0)


适用于已经学习过es的同学快速查阅。

索引库

常见属性

  1. 核心配置
    settings 全局设置,如主分片数(number_of_shards)、副本数(number_of_replicas)、刷新间隔(refresh_interval)等
    mappings 定义文档结构,包含字段类型和属性配置

  2. 字段类型
    text 全文检索类型,会分词,可配置分词器(analyzer)
    keyword 精确匹配类型,不分词,适合标签、ID 等

  3. 数值类型
    long/integer/double等,存储数字数据
    date 日期类型,支持多种格式(如yyyy-MM-dd、时间戳)
    boolean 布尔类型,存储true/false或等效数值 / 字符串
    object 存储嵌套 JSON 对象,内部字段独立存储
    nested 特殊object类型,解决数组对象查询歧义

  4. 通用属性
    index 控制字段是否索引(true/false,默认true)
    store 控制字段是否独立存储(默认false,从_source提取)
    ignore_above 超过指定长度的keyword字段不索引
    format 针对date等类型,指定数据格式

  5. 记住常用的,其他用到的时候再查就行。

创建

PUT /索引库
{
  "mappings": {
    "properties": {
      "info": {
        "type": "text",
        "analyzer": "ik_smart",
        "index": true
      },
      "name": {
        "type": "object", 
        "properties": {
          "firstName":{
            "type": "keyword"
          },
          "lastName": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

查询

GET /索引库

删除

DELETE /索引库

修改(只可新增字段)

PUT /索引库/_mapping
{
  "properties": {
    "age": {
      "type": "long"
    }
  }
}

文档

新增

POST /索引库/_doc/文档id
{
	"age": 15,
	"info": "你好",
	"name": {
	  "firstName": "li",
	  "lastName": "bai"
	}
}

查询

GET /索引库/_doc/文档id

删除

DELETE /索引库/_doc/文档id

全量修改

先删除后新增。
存在即修改,不存在则新增。有点像mysql的duplicate

PUT /索引库/_doc/文档id
{
	// 要修改的字段
}

增量修改

POST /索引库/_update/文档id
{
	// 要修改的字段
}

查询

查询全部

GET /cosmos/_search
{
  "query": {
    "match_all": {
      
    }
  }
}

条件查询

GET /索引库/_search
{
  "query": {
    "match": {
      "FIELD": "TEXT"
    }
  }
}
  1. 字段可用填写all表示文档全部字段中查询,7之前默认创建,7+被copy_to机制取代。
  2. 相似度评分(TF-IDF)
    对匹配到的文档计算相关性得分(_score),核心逻辑基于 TF-IDF:
    TF(词频):词条在当前文档中出现的频率越高,得分越高。
    IDF(逆文档频率):词条在整个索引中出现的文档越少(越稀有),得分越高。
    最终得分是 TF、IDF 及字段长度归一化(字段越短,相同词频下得分越高)等因素的综合计算结果。
    7后使用BM25算法

精确查询

一般查找keyword

GET /索引库/_search
{
  "query": {
    "term": {
      "FIELD": {
        "value": "VALUE"
      }
    }
  }
}

范围查询

GET /索引库/_search
{
  "query": {
    "range": {
      "FIELD": {
        "gte": 10,
        "lte": 20
      }
    }
  }
}

位置查询

  1. 矩阵查询
GET /索引库/_search
{
  "query": {
    "geo_bounding_box": {
      "FIELD": {  
        "top_left": {
          "lat": 40.73,
          "lon": -74.1
        },
        "bottom_right": {
          "lat": 40.01,
          "lon": -71.12
        }
      }
    }
  }
}
  1. 中心点范围查询
GET /cosmos/_search
{
  "query": {
    "geo_distance": {
      "distance": "10km",  // 范围(支持 km、m、mi 等单位)
      "FIELD": {        // 需为 geo_point 类型字段
        "lat": 39.9042,    // 中心点纬度
        "lon": 116.4074    // 中心点经度(示例为北京坐标)
      }
    }
  }
}

简化:

GET /索引库/_search
{
  "query": {
    "geo_distance": {
      "distance": "5km",
      "FIELD": "39.9042, 116.4074"  // 直接使用 "纬度,经度" 字符串
    }
  }
}

算分查询

默认算法的基础上,添加一些算分规则。

GET /索引库/_search
{
  "query": {
    "function_score": {
      "query": {  // 基础查询:匹配all字段包含"手机"的文档
        "match": {
          "all": "手机"
        }
      },
      "functions": [  // 评分函数:对符合条件的文档增加权重
        {
          "filter": {  // 筛选条件:brand字段为"苹果"
            "term": {
              "brand": "苹果"
            }
          },
          "weight": 10  // 符合筛选条件的文档,评分权重增加10
        }
      ],
      "boost_mode": "sum"  // 评分合并方式:基础分 + 函数分
    }
  }
}

boost_mode有这些模式:multiply、sum、min、max、replace。

bool 复合查询

GET /索引库/_search
{
  "query": {
    "bool": {
      "must": [
        { "term": { "district": "朝阳区" } }  // 必须在朝阳区
      ],
      "should": [
        { "term": { "cuisine": "川菜" } },    // 优选川菜
        { "term": { "cuisine": "湘菜" } }     // 或湘菜
      ],
      "must_not": [
        { "range": { "average_price": { "gte": 800 } } }  // 排除人均≥800的高端餐厅
      ],
      "filter": [
        { "range": { "rating": { "gte": 4.2 } } }  // 筛选评分≥4.2的餐厅(不影响算分)
      ]
    }
  }
}
  1. must 必须包含
  2. should 或者
  3. must_not 不包含(不影响分数计算)
  4. filter 过滤(不影响分数计算)

结果处理

排序

默认按分数排序,可以自己指定字段排序,指定后就会放弃打分。

GET /索引库/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "FIELD": "desc"  // asc,desc
    }
  ]
}

特殊:地理位置排序:

GET /索引库/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "_geo_distance": {
        "FIELD": "纬度, 经度",  
        "order": "asc",
        "unit": "km"
      }
    }
  ]
}

分页

默认10个。

GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
  "from": 990,  // 分页开始的位置,默认为0
  "size": 10,   // 期望获取的文档总数
  "sort": [
    {"price": "asc"}  // 按price字段升序排序
  ]
}

from + size 不能大于1万。

高亮

GET /索引库/_search
{
  "query": {
    "match": {
      "FIELD": "TEXT"  // 替换为实际的字段名和要匹配的文本
    }
  },
  "highlight": {
    "fields": {
      "FIELD": {  // 要高亮显示的字段,与查询字段保持一致
        "pre_tags": ["<em>"],  // 高亮前置标签
        "post_tags": ["</em>"]  // 高亮后置标签
      }
    }
  }
}

聚合

分为:Bucket 聚合(桶聚合)、Metric 聚合(指标聚合)、Pipeline 聚合(管道聚合)、Matrix 聚合(矩阵聚合,少见)

Bucket 聚合(桶聚合)

GET /索引库/_search
{
  "size": 0,  // 设置size为0,结果中不包含文档,只包含聚合结果
  "aggs": {   // 定义聚合
    "xxAgg": {  // 给聚合起个名字
      "terms": {   // 聚合的类型,terms表示按字段值分组
        "field": "brand",  // 参与聚合的字段
        "size": 20  // 希望获取的聚合结果数量
      }
    }
  }
}

Metric 聚合(指标聚合)

GET /hotel/_search
{
  "size": 0,
  "aggs": {
    "xxAgg": {
      "terms": {
        "field": "brand",
        "size": 20
      },
      "aggs": {  // 这是xxAgg聚合的子聚合
        "score_stats": {  // 子聚合名称
          "stats": {  // 聚合类型,会计算min、max、avg、sum、count
            "field": "score"  // 要计算统计信息的字段
          }
        }
      }
    }
  }
}

自动补全

// 1. 创建索引库并定义completion类型字段
PUT 索引库
{
  "mappings": {
    "properties": {
      "title": {
        "type": "completion"  // 定义为completion类型,用于自动补全
      }
    }
  }
}

// 2. 添加示例文档,字段内容为词条数组
POST 索引库/_doc
{
  "title": ["Sony", "WH-1000XM3"]
}

POST test/_doc
{
  "title": ["SK-II", "PITERA"]
}

POST test/_doc
{
  "title": ["Nintendo", "switch"]
}

// 3. 执行自动补全查询
POST 索引库/_search
{
  "suggest": {
    "title_suggest": {  // 补全查询名称
      "prefix": "S",    // 用户输入的前缀
      "completion": {
        "field": "title" // 指定补全字段
      }
    }
  }
}


网站公告

今日签到

点亮在社区的每一天
去签到