当前位置: 首页 > 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.dtcms.com/a/363782.html

相关文章:

  • Linux一共有多少个版本?
  • 基于SpringBoot2+Vue2开发的储物柜管理系统
  • 详解STM32的完整启动流程
  • Java流程控制04——if选择结构(本文为个人学习笔记,内容整理自哔哩哔哩UP主【遇见狂神说】的公开课程。 > 所有知识点归属原作者,仅作非商业用途分享)
  • CentOS 7 服务器CPU突然飙升至100%?精准定位问题。
  • HBase Region
  • token存储方案
  • 告别传统照明!安科瑞 DALI 总线智能照明系统,解锁公建项目照明新体验
  • 机器人控制器开发(人形机器人产品设计)
  • 【C++模板】从起源到入门,小白必学泛型编程指南
  • 民间药方偏方网站整站源码 带数据PHP版
  • 【爬油管搜索视频软件】youtube爬虫工具,根据关键词采集搜到的视频数据
  • 分布式爬虫的全局请求间隔协调与IP轮换策略
  • 重磅!PS2021 和企业微信 5.0 可直接运行,统信兼容引擎 V3.3.2 全面升级!
  • 【最新Pr 2025安装包(Adobe Premiere Pro 2025 中文解锁版)安装包永久免费版下载安装教程】
  • 用了企业微信 AI 半年,这 5 个功能让我彻底告别重复劳动
  • 深度学习篇---DenseNet
  • 机器人控制器开发(整体架构2 Lerobot介绍)
  • [嵌入式embed][Qt]Qt5.12+Opencv4.x+Cmake4.x_测试Qt编译的opencv4.x的库
  • 移动硬盘删除东西后,没有释放空间
  • 滚珠导轨在工业制造领域如何实现高效运行?
  • java-设计模式-4-创建型模式-工厂
  • 金博智慧:数量感知与注意力对儿童数学成绩的影响
  • OpenTiny NEXT 训练营实操体验 | 四步将你的 Web 应用升级为智能应用
  • Unity通过Object学习原型模式
  • 第三家公司虽然用了powerbi,但更适合用excel
  • QuickBI的已选字段 vs PowerBI的字段参数
  • 语音机器人交互系统:核心技术与应用挑战
  • 互联网向无线通信发展的关键历史时期
  • C语言风格字符串:概念、问题与解决方案