当前位置: 首页 > news >正文

Elasticsearch常用DSL快速查询指南

文章目录

  • 索引库
    • 常见属性
    • 创建
    • 查询
    • 删除
    • 修改(只可新增字段)
  • 文档
    • 新增
    • 查询
    • 删除
    • 全量修改
    • 增量修改
  • 查询
    • 查询全部
    • 条件查询
    • 精确查询
    • 位置查询
    • 算分查询
    • bool 复合查询
  • 结果处理
    • 排序
    • 分页
    • 高亮
  • 聚合
    • Bucket 聚合(桶聚合)
    • Metric 聚合(指标聚合)
  • 自动补全

适用于已经学习过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" // 指定补全字段}}}
}
http://www.xdnf.cn/news/1433305.html

相关文章:

  • Vue.js 中深度选择器的区别与应用指南
  • 从零开始学Vue3:Vue3的生命周期
  • 前端架构知识体系:常见图片格式详解与最佳实践
  • [密码学实战]逆向工程常见工具合集及下载地址(四十七)
  • 23种设计模式-抽象工厂模式
  • CICD实战(3) - 使用Arbess+GitLab+Hadess实现Java项目构建/上传制品库
  • qt使用笔记三之 QGraphicsView、QGraphicsScene 和 QGraphicsPixmapItem 详解
  • 大模型常用的数据类型FP32,BF16,FP16
  • 基于arm芯片的驱动开发——温湿度传感器dht11
  • Java 垃圾回收机制(GC算法、GC收集器如G1、CMS)的必会知识点汇总
  • Java面试实战系列【JVM篇】- JVM内存结构与运行时数据区详解(共享区域)
  • JavaSE丨异常处理详解,高效应对程序中的“意外”
  • 结构抗震与土木工程研究
  • Windows控制台颜色修改
  • 移动端网页设计vm+rem,和px实现方式对比
  • 【设计模式】三大原则 单一职责原则、开放-封闭原则、依赖倒转原则
  • Javascript》》JS》》ES6》 Map、Set、WeakSet、WeakMap
  • 【MATLAB绘图进阶】(3.1)从基础到高级的图形样式控制
  • Android14 init.rc各个阶段的主要操作详解2
  • gbase8s之导出mysql导入gbase8s
  • 良策金宝AI:电力工程的“最强大脑”,如何重塑设计新范式?
  • css中的v-bind 动态变化
  • 技术架构设计--资源与链接、安全灾备
  • Android URC 消息透传 MTK 代码方案
  • T40N君正/INGENIC专业嵌入式CPU计算能力,集成XBurst2双核处理器(1.2GHz)、RISC-V协处理器和神经网络加速器(2TOPS算力)
  • 防止应用调试分析IP被扫描加固实战教程
  • 宋红康 JVM 笔记 Day11|直接内存
  • 爬虫基础学习 - Beautifulsoup
  • 电子电子技术知识------MOSFET管
  • 高校党建信息管理系统的设计与实现-(源码+LW+可部署)