Elasticsearch常用DSL快速查询指南
文章目录
- 索引库
- 常见属性
- 创建
- 查询
- 删除
- 修改(只可新增字段)
- 文档
- 新增
- 查询
- 删除
- 全量修改
- 增量修改
- 查询
- 查询全部
- 条件查询
- 精确查询
- 位置查询
- 算分查询
- bool 复合查询
- 结果处理
- 排序
- 分页
- 高亮
- 聚合
- Bucket 聚合(桶聚合)
- Metric 聚合(指标聚合)
- 自动补全
适用于已经学习过es的同学快速查阅。
索引库
常见属性
-
核心配置
settings 全局设置,如主分片数(number_of_shards)、副本数(number_of_replicas)、刷新间隔(refresh_interval)等
mappings 定义文档结构,包含字段类型和属性配置 -
字段类型
text 全文检索类型,会分词,可配置分词器(analyzer)
keyword 精确匹配类型,不分词,适合标签、ID 等 -
数值类型
long/integer/double等,存储数字数据
date 日期类型,支持多种格式(如yyyy-MM-dd、时间戳)
boolean 布尔类型,存储true/false或等效数值 / 字符串
object 存储嵌套 JSON 对象,内部字段独立存储
nested 特殊object类型,解决数组对象查询歧义 -
通用属性
index 控制字段是否索引(true/false,默认true)
store 控制字段是否独立存储(默认false,从_source提取)
ignore_above 超过指定长度的keyword字段不索引
format 针对date等类型,指定数据格式 -
记住常用的,其他用到的时候再查就行。
创建
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"}}
}
- 字段可用填写all表示文档全部字段中查询,7之前默认创建,7+被copy_to机制取代。
- 相似度评分(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}}}
}
位置查询
- 矩阵查询
GET /索引库/_search
{"query": {"geo_bounding_box": {"FIELD": { "top_left": {"lat": 40.73,"lon": -74.1},"bottom_right": {"lat": 40.01,"lon": -71.12}}}}
}
- 中心点范围查询
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的餐厅(不影响算分)]}}
}
- must 必须包含
- should 或者
- must_not 不包含(不影响分数计算)
- 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" // 指定补全字段}}}
}