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

Elasticsearch QueryDSL 教程

什么是 Elasticsearch QueryDSL

Elasticsearch Query DSL 是 Elasticsearch 用来构建和执行搜索查询的 JSON 格式查询语言,支持丰富的查询和过滤条件,帮助用户精准检索和分析数据。它类似于 MySQL 中的 SQL 查询语句(SELECT 语句),都是用来定义从数据库或索引中筛选和返回数据的规则和条件。

MySql 和 Elasticsearch 的区别

MySQL 概念Elasticsearch 概念说明
数据库(Database)索引(Index)ES 中一个 Index 就相当于 MySQL 中的一个数据库,里面存储类结构相似的数据。比如 users 索引存放用户数据,orders 索引存放订单数据。
表(Table)类型(Type,7.x 后已废弃)早期 ES 在一个索引里可以有多种 Type,像数据库里的一张张表。但从 7.x 开始官方废弃 Type,一个 Index 只能有一种数据结构,相当于 一个索引 = 一张表。
行(Row)文档(Document)ES 存储的最小单位是一个 Document,相当于 MySQL 里的一行数据。文档用 JSON 格式存储。
列(Column)字段(Field)Document 里的每个 key/value 就是一个 Field,对应 MySQL 里的列。
主键(Primary Key)_id每个 Document 都有唯一的 _id,相当于主键,可以由 ES 自动生成,也可以手动指定。
SQLQuery DSLMySQL 用 SQL 查询,ES 用 Query DSL(一种 JSON 风格的查询语法)。


数据类型介绍

1. 核心数据类型(Core datatypes)

类型名说明典型用途

text

分词后的字符串,用于全文检索

商品描述、文章内容、评论、日志文本等

keyword

不分词的字符串,适合精确匹配和聚合

标签、状态码、分类、用户名、ID、邮箱等

boolean

布尔值(true / false)

是否启用,开关标识

integer

32位整数

年龄、数量、评分等

long

64位整数

大整数计数、时间戳

short

16位整数

较小范围数值

byte

8位整数

非常小的整数范围

double

双精度浮点数

价格、权重、坐标等

float

单精度浮点数

轻量级浮点数

half_float

半精度浮点数

对精度要求较低的浮点数

scaled_float

以整数存储浮点数,乘以缩放因子存储

金额、价格(避免浮点误差)

date

日期时间类型,支持多种格式

订单时间、日志时间

date_nanos

纳秒精度日期时间

高精度时间戳

2. 复杂数据类型(Complex datatypes)

类型名说明典型用途
objectJSON 对象,可嵌套多层字段复杂文档结构,如用户信息中嵌套地址对象
nested嵌套类型,支持多值数组中每个元素作为独立对象查询商品规格列表、订单明细列表

3. 特殊数据类型(Specialized datatypes)

类型名说明典型用途
geo_point地理坐标点(经纬度)地理位置定位、地图检索
geo_shape复杂地理形状(多边形、圆等)地理范围查询、地理围栏
ipIPv4 或 IPv6 地址服务器 IP、客户端 IP
completion自动补全建议类型搜索自动补全
token_count统计分词后词数统计分析
murmur3MurmurHash3 哈希码唯一标识生成
binary二进制数据图片、文件二进制存储
join父子关系建模一对多、多对多文档关联

HTTP 请求方法介绍

方法作用典型 Elasticsearch 场景
GET获取数据或状态,不改变数据查询文档、获取索引信息、获取集群状态
POST提交数据,创建资源或执行复杂操作新增文档(自动生成ID)、执行复杂搜索请求、更新文档(部分更新)、批量操作
PUT创建或完全替换资源创建索引、创建或覆盖指定ID的文档
DELETE删除资源删除文档、删除索引、删除模板
PATCHElasticsearch 不常用ES 原生API一般不用 PATCH,但理论上用于部分更新(ES用POST+_update代替)
HEAD获取资源的元信息,不返回主体检查索引是否存在,检查文档是否存在

Endpoint 端点接口介绍

API 路径作用说明典型用途
/{index}/_doc文档增删改查的基础接口添加文档(POST)、获取文档(GET)、删除文档(DELETE)
/{index}/_update文档的部分更新局部修改文档字段,执行脚本等
/{index}/_search搜索接口全文检索、复杂查询
/{index}索引的创建、删除、获取索引信息等创建索引(PUT)、删除索引(DELETE)、获取索引信息(GET)
/_bulk批量操作接口批量新增、更新、删除文档
/_mapping获取或更新索引映射(字段类型定义)查看或调整字段类型和属性
/_settings获取或更新索引设置调整分片、副本、刷新频率等
/_cat便捷的索引、节点、集群信息展示接口查看集群状态、索引列表、节点健康等
/_cluster集群级别管理接口查看集群健康、状态,管理集群设置
/_alias管理索引别名创建、删除、查看别名
/_count统计文档数量查询符合条件的文档总数
/_reindex索引重建将数据从一个索引复制到另一个索引
/_flush手动刷新索引强制把缓冲区数据写入磁盘,减少数据丢失风险

索引 (Index)(表) 相关命令

索引 就是 mysql 中的表,索引 = 表

创建索引

方式一:// 只创建索引结构

PUT /my_index                  // my_index:自定义的索引(表)名称
{"mappings": {                // mappings 创建索引的关键字,表示 映射定义开始"properties": {            // properties 创建索引的关键字,表示 定义字段集合"name": {                // 自定义字段名称"type": "text"         // 字段类型,text:分词字符串 全文检索字符串},"age": {                 // 自定义字段名称"type": "integer"      // 字段类型,integer:32位整数类型},"status": {              // 自定义字段名称"type": "keyword"      // 字段类型,keyword:不分词字符串,用于精确匹配}}}
}

方式二:// 添加一行数据,索引结构不存在时自动创建索引。缺点:自动映射不够精准,复杂场景建议手动建索引。

POST /my_index/_doc
{"name": "Alice","age": 25
}

查询索引列表

查询所有索引

GET /_cat/indices

查询指定的索引,* 通配符的方式,通配符可以使用在开头、中间、结尾

GET /_cat/indices/前缀*?v
GET /_cat/indices/*后缀?v
GET /_cat/indices/*xxx*yyy*?v
GET /_cat/indices/*x*y*z*?v

查看索引数据结构

查看表结构

命令:

GET /索引名/_mapping

示例:

GET /my_index/_mapping

修改索引数据结构

!!! 不能直接修改已存在字段的类型

一旦索引创建且字段映射确定后,字段的类型是固定的,不能修改字段类型,比如把 text 改成 keyword 是不允许的。
如果要修改字段类型,通常需要新建一个索引,重新定义 mapping,然后把数据 reindex(迁移)过去。

reindex 迁移示例:

需求:假设旧索引有字段 fullname,新索引改成了 name。

原索引:

PUT /old_users
{"mappings": {"properties": {"fullname": { "type": "text" },"age":      { "type": "integer" },"status":   { "type": "keyword" }}}
}

新索引:

PUT /new_users
{"mappings": {"properties": {"name":    { "type": "text" },"age":     { "type": "integer" },"status":  { "type": "keyword" },"email":   { "type": "keyword" }}}
}

迁移命令:

POST /_reindex
{"source": {"index": "old_users"},"dest": {"index": "new_users"},"script": {"source": """ctx._source.name = ctx._source.remove('fullname');"""}
}# ctx._source.name 新索引 新字段
# ctx._source.remove('fullname') 旧索引 旧字段

删除索引

删除表

删除指定的索引

命令:

DELETE /索引名

删除多个索引,使用 * 通配符

DELETE /*索*引*名*

未完待续

http://www.lryc.cn/news/615894.html

相关文章:

  • Linux操作系统从入门到实战(十八)在Linux里面怎么查看进程
  • 三、k8s 1.29 之 安装1网络 / ikuai路由器虚拟机安装
  • Linux810 shell 条件判断 文件工具 ifelse
  • JavaWeb(苍穹外卖)--学习笔记18(Apache POI)
  • 【QT】常⽤控件详解(七)容器类控件 GroupBox TabWidget 布局管理器 Spacer
  • 祝融号无线电工作频段
  • redis主从模型与对象模型
  • Jmeter性能测试之检测服务器CPU/Memory/磁盘IO/网络IO
  • Flask多进程数据库访问问题详解
  • 深度学习周报(8.4~8.10)
  • ​LabVIEW键盘鼠标监控
  • Python爬虫实战:研究BlackWidow,构建最新科技资讯采集系统
  • Windows执行kubectl提示拒绝访问【Windows安装k8s】
  • 【Linux指南】Vim的全面解析与深度应用
  • nginx下lua的实现机制、Lua错误处理、面向对象
  • 系统集成项目管理工程师【第十一章 规划过程组】规划资源管理、估算活动资源、规划沟通管理和规划风险管理篇
  • 大模型时代的机器人研究趋势:从多模态融合到高效迁移
  • 在Mac上搭建本地AI工作流:Dify与DeepSeek的完美结合
  • Python爬虫实战:研究Ruia框架,构建博客园文章采集系统
  • reuse: for booting my spring project with mvn in Windows command line
  • String AOP、事务、缓存
  • Fish shell的abbr命令行参数介绍和Bat文件查看工具
  • Android 四大布局:使用方式与性能优化原理
  • Qt中的设计模式:经典的MVC,MVP和MVVM
  • 北京JAVA基础面试30天打卡06
  • 【webPack|Vite】了解常用配置,主要差异
  • 腾讯云EdgeOne Pages深度使用指南
  • 【后端】Java 8 特性 Optional 可选类 介绍
  • 7.企业级AD活动目录的备份与恢复策略
  • Celery分布式任务队列