ElasticSearch | Elasticsearch与Kibana页面查询语句实践
关注:CodingTechWork
引言
在当今大数据应用中,Elasticsearch(简称 ES)以其高效的全文检索、分布式处理能力和灵活的查询语法,广泛应用于各类日志分析、用户行为分析以及实时数据查询等场景。通过 ES,用户可以轻松地查询大量数据、进行复杂的数据筛选、聚合分析等操作。
本文将结合实际应用场景,深入讲解 Elasticsearch 基础和高级查询语句的使用原理与技巧,帮助读者通过实践掌握 ES 查询的核心概念和技术。
索引
索引设计与数据模型
首先,我们假设demo_operate_log_data_m202501_read索引存储了用户的基本信息。每个文档表示一个用户,字段包括:
user_id:用户唯一标识符(例如:user_123)
name:用户姓名
age:用户年龄
gender:用户性别(如:male 或 female)
email:用户邮箱
phone_number:用户电话号码
register_date:用户注册时间(日期类型)
last_login:用户最后登录时间(日期类型)
location:用户所在地理位置(如:Beijing、Shanghai)
这些字段将在我们接下来的查询中作为查询条件,以获取用户的详细信息。下面将根据不同的查询需求展示 Elasticsearch 查询的基础和高级用法。
创建索引
在 Elasticsearch 中,创建索引时,通常会定义索引的映射(mapping),指定字段类型、分析器等属性。下面是一个示例索引创建语句,针对 demo_operate_log_data_m202501_read索引,我们假设它包含了与用户相关的字段。
示例:demo_operate_log_data_m202501_read索引创建语句
PUT /demo_operate_log_data_m202501_read
{"mappings": {"properties": {"user_id": {"type": "keyword" // 用户唯一标识符,通常用 keyword 类型以便精确匹配},"name": {"type": "text" // 用户姓名,使用 text 类型以支持全文搜索},"age": {"type": "integer" // 用户年龄,使用整数类型},"gender": {"type": "keyword" // 用户性别,通常是固定值,使用 keyword 类型},"email": {"type": "keyword" // 用户邮箱,使用 keyword 类型},"phone_number": {"type": "keyword" // 用户电话号码,使用 keyword 类型},"register_date": {"type": "date" // 注册时间,使用日期类型},"last_login": {"type": "date" // 最后登录时间,使用日期类型},"location": {"type": "text" // 用户所在位置,使用 text 类型以支持全文搜索}}}
}
解释:
- user_id:使用 keyword 类型,这样可以确保查询时进行精确匹配,因为 keyword 不会被分词。
- name:使用 text 类型,支持全文搜索,可以在姓名中进行模糊搜索。
- age:使用 integer 类型,用于存储年龄的整数值。
- gender、email 和 phone_number:使用 keyword 类型,这些字段通常会是固定值或标识符,适合精确查询。
- register_date 和 last_login:使用 date 类型,适合存储日期时间格式数据。
- location:使用 text 类型,以便对用户的地理位置信息进行全文搜索。
插入数据
接下来我们将根据刚才定义的demo_operate_log_data_m202501_read索引,插入一些示例数据。这些数据将包括用户的user_id、name、age、gender、email、phone_number、register_date、last_login 和 location字段。
POST /demo_operate_log_data_m202501_read/_doc/1
{"user_id": "U001","name": "Alice Wang","age": 29,"gender": "female","email": "alice.wang@example.com","phone_number": "+86-13800000001","register_date": "2023-01-15T10:30:00","last_login": "2025-01-05T15:45:00","location": "Beijing, China"
}POST /demo_operate_log_data_m202501_read/_doc/2
{"user_id": "U002","name": "Bob Zhang","age": 34,"gender": "male","email": "bob.zhang@example.com","phone_number": "+86-13800000002","register_date": "2022-06-10T08:20:00","last_login": "2025-01-06T09:00:00","location": "Shanghai, China"
}POST /demo_operate_log_data_m202501_read/_doc/3
{"user_id": "U003","name": "Charlie Li","age": 25,"gender": "male","email": "charlie.li@example.com","phone_number": "+86-13800000003","register_date": "2024-03-22T14:10:00","last_login": "2025-01-07T18:30:00","location": "Guangzhou, China"
}POST /demo_operate_log_data_m202501_read/_doc/4
{"user_id": "U004","name": "David Liu","age": 40,"gender": "male","email": "david.liu@example.com","phone_number": "+86-13800000004","register_date": "2020-11-18T16:50:00","last_login": "2025-01-04T12:00:00","location": "Shenzhen, China"
}POST /demo_operate_log_data_m202501_read/_doc/5
{"user_id": "U005","name": "Eva Zhang","age": 31,"gender": "female","email": "eva.zhang@example.com","phone_number": "+86-13800000005","register_date": "2021-09-30T11:00:00","last_login": "2025-01-06T16:10:00","location": "Chengdu, China"
}


解释:
- 每条数据通过 POST 请求插入到 Elasticsearch 索引
demo_operate_log_data_m202501_read中。 - 数据中的
user_id为每个用户的唯一标识符。 name、age、gender、email、phone_number、register_date、last_login 和 location都是与用户相关的属性,按需求填充相应的信息。- 日期格式为
yyyy-MM-dd'T'HH:mm:ss,符合 Elasticsearch 的日期格式。
插入成功后的输出:
插入数据成功后,Elasticsearch 会返回类似下面的响应(每个请求的响应可能有所不同,以下是一个例子):
{"_index": "demo_operate_log_data_m202501_read","_id": "1","_version": 1,"result": "created","_shards": {"total": 1,"successful": 1,"failed": 0},"_seq_no": 0,"_primary_term": 1
}
每个用户的文档都会被成功插入到索引中,并可以通过 ID 或查询来访问。
基础查询
精确匹配查询 (term 查询)
在 Elasticsearch 中,精确匹配查询通常使用 term 查询。假设我们要查询 user_id 为 U001 的用户基本信息,可以使用如下的 term 查询:
GET /demo_operate_log_data_m202501_read/_search
{"query": {"term": {"user_id": "U001"}}
}

解释:
- term 查询用于精确匹配字段的值。
- 如果 user_id 在映射中被定义为 keyword 类型,那么它会按照原样进行精确匹配。
匹配查询 (match 查询)
对于文本类型的字段,match 查询能够实现更灵活的搜索。例如,我们要查询所有名字包含 “John” 的用户:
GET /demo_operate_log_data_m202501_read/_search
{"query": {"match": {"name": "Charlie Li"}}
}

解释:
- match 查询适用于全文搜索,ES 会对文本字段进行分词后进行搜索。
- 对于如 name 这样的文本字段,match 查询可以匹配到所有包含 “Charlie Li” 的用户,无论是名字中间、开始或结束部分。
范围查询 (range 查询)
如果我们想查询年龄在 20 到 30 岁之间的用户,可以使用 range 查询:
GET /demo_operate_log_data_m202501_read/_search
{"query": {"range": {"age": {"gte": 20,"lte": 30}}}
}

解释:
- range 查询适用于数字或日期类型字段。通过设置 gte(大于或等于)和 lte(小于或等于)来定义一个范围。
- 该查询返回所有年龄在 20 到 30 岁之间的用户。
布尔查询 (bool 查询)
布尔查询可以将多个查询条件组合起来。假设我们要查询年龄在 20 到 30 岁之间,且性别为 “female” 的用户,可以使用 bool 查询:
GET /demo_operate_log_data_m202501_read/_search
{"query": {"bool": {"must": [{"range": {"age": {"gte": 20,"lte": 30}}},{"term": {"gender": "female"}}]}}
}

解释:
bool查询结合了多个查询条件,其中must表示条件必须满足。range查询筛选年龄,term查询筛选性别。must可以包含任意多个查询子句,适用于复杂的多条件组合查询。
高级查询
聚合查询 (aggregations)
聚合查询允许我们对数据进行统计、分组和汇总分析。假设我们需要统计每个年龄段内的用户数量,可以使用 range 聚合查询:
GET /demo_operate_log_data_m202501_read/_search
{"size": 0,"aggs": {"age_groups": {"range": {"field": "age","ranges": [{"to": 18},{"from": 18,"to": 30},{"from": 30,"to": 50},{"from": 50}]}}}
}

解释:
- 该查询使用
range聚合将用户的年龄划分为不同的区间,并统计每个区间内的用户数量。 size: 0 表示不返回文档内容,只返回聚合结果。
若size不为0,则返回文档内容。

多字段匹配查询 (multi_match 查询)
如果我们需要在多个字段上进行搜索,例如查询包含 “Charlie Li” 的用户,并且可以在 name、email 和 phone_number 等字段中匹配,我们可以使用 multi_match 查询:
GET /demo_operate_log_data_m202501_read/_search
{"query": {"multi_match": {"query": "Charlie","fields": ["name","email","phone_number"]}}
}

解释:
multi_match查询可以在多个字段中查找与查询词匹配的文档,适用于需要在多个字段中执行类似的查询。fields参数指定要查询的字段列表,query是我们要搜索的关键词。- 默认情况下,
multi_match查询会在所有指定的字段中查找,只要其中一个字段包含查询词中的任意词,文档就会匹配并返回。例如,在你的查询中,如果 name 字段匹配 “Charlie”,或者 email 字段匹配 “Li”(或者两者都有),文档都会被返回。
分页查询 (from 和 size 参数)
在面对大量数据时,通常会进行分页查询,以分批次返回查询结果。假设我们要查询第 2 页的用户,每页显示 2 条记录:
GET /demo_operate_log_data_m202501_read/_search
{"query": {"match_all": {}}
}GET /demo_operate_log_data_m202501_read/_search
{"query": {"match_all": {}},"from": 1,"size": 2
}
先验证查看全部的

再分页查

解释:
query -> match_all:match_all 查询会返回该索引中的所有文档。这是一种无条件匹配所有文档的查询,通常用于检索整个索引的数据。from: 1:这是分页的参数之一,表示从第 2 条记录开始(从 0 开始计数)。所以会跳过第 1 条文档,返回从第 2 条文档开始的结果。size: 2:这个参数控制每次查询返回的文档数量。设置为 2 表示查询会返回 2 条结果。
字段排序查询 (sort 参数)
在某些情况下,我们需要对查询结果进行排序。例如,查询最新注册的 2 个用户,可以按 register_date字段进行排序:
GET /demo_operate_log_data_m202501_read/_search
{"query": {"match_all": {}},"sort": [{"register_date": {"order": "desc"}}],"_source": ["user_id", "name", "register_date"]
}GET /demo_operate_log_data_m202501_read/_search
{"query": {"match_all": {}},"sort": [{"register_date": {"order": "desc"}}],"size": 2
}
先验证看所有的排序

排序筛选前两个

解释:
sort参数用于指定排序规则,register_date 字段按降序排列,表示返回最新注册的用户。size限制每次返回的记录数量。
模糊查询 (fuzzy 查询)
如果用户输入的查询条件可能包含拼写错误,fuzzy 查询可以帮助我们进行模糊匹配。例如,我们要查询姓氏为 “Charlie Li” 的用户,但用户可能输入 “Charlie Lixxx”:
GET /demo_operate_log_data_m202501_read/_search
{"query": {"bool": {"should": [{"fuzzy": {"name": {"value": "Zhang","fuzziness": "AUTO"}}}]}}
}

解释:
bool查询:bool查询的should子句意味着至少满足其中一个条件。当前查询中,只有一个模糊查询条件。fuzzy查询:fuzzy查询是用于模糊匹配的。在这里,查询目标是 name 字段,查询的关键词是 “Zhang”,模糊度为"AUTO",即自动选择最佳的模糊度。fuzziness: "AUTO":"AUTO"表示根据字符串的长度自动选择合适的模糊度。例如,短字符串可能只会有一个字符的差异(fuzziness: 1),而较长的字符串可能允许更多的字符差异(fuzziness: 2或更多)。
总结
通过本篇博客,我们详细介绍了 Elasticsearch 的基础和高级查询语法。我们展示了如何使用精确匹配查询(term)、全文搜索(match)、范围查询(range)、布尔查询(bool)等技术,帮助开发者快速检索用户基础信息。同时,我们还探讨了如何进行数据统计、聚合查询、多字段匹配等。
相关文章:
ElasticSearch | Elasticsearch与Kibana页面查询语句实践
关注:CodingTechWork 引言 在当今大数据应用中,Elasticsearch(简称 ES)以其高效的全文检索、分布式处理能力和灵活的查询语法,广泛应用于各类日志分析、用户行为分析以及实时数据查询等场景。通过 ES,用户…...
12.C语言中的struct详解:定义、赋值、指针、嵌套与位字段
目录 1.简介2.struct 的复制3.struct 指针4.struct 的嵌套5.位字段6.弹性数组成员 1.简介 本篇原文为:C语言中的struct详解:定义、赋值、指针、嵌套与位字段。 更多C进阶、rust、python、逆向等等教程,可点击此链接查看:酷程网 …...
文件读写到SQLite数据库的方法
在 SQLite 数据库中,将文件读写到数据库的常见方法主要有以下几种: 1. 将文件以 BLOB 类型存储 BLOB(Binary Large Object) 是 SQLite 中的二进制数据类型,可以直接用来存储文件内容。 步骤: 创建表 创建一…...
springboot项目部署至linux
1.修改pom.xml 确认是否有以下代码,没有请进行添加,mainClass改成你的启动类 <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.ve…...
使用sed命令封装自定义dos2unix脚本
使用sed命令封装自定义dos2unix脚本 创建 `dos2unix` 脚本使用自定义的 `dos2unix` 脚本注意事项要将 sed -i 封装为一个简单的 dos2unix 脚本,你可以创建一个 Bash 脚本文件,该文件接受文件名作为参数,并使用 sed 命令来删除文件中的 DOS 回车符(\r)。以下是一个基本的实…...
调整Python+Pytest+Allure+Yaml+Pymysql框架中需要执行的用例顺序
当pytest框架中有时时候会因为用例的前后关联关系需要调整用例执行顺序时则可以跟进具体的要求调整pytest.ini配置文件中执行用例文件夹的前后顺序 当如果是需要调整某个文件夹中用例的执行顺序时,则跟进具体的文件调整对应testcases中test_*.py文件中的执行顺序...
带内管理和带外管理
带内管理(In-Band Management) 概述 带内管理是一种借助生产网络来传输管理数据的网络管理方式,其管理流量与业务流量共享相同的网络路径。 特点 共享网络路径:管理数据和业务数据一同使用现有的网络基础设施,在同…...
【操作系统】阻塞非阻塞I/O、同步异步I/O
阻塞I/O:程序发起I/O操作时,程序被挂起,直到I/O操作完成并返回结果。在这个过程中,程序会被阻塞无法执行其他任务。适用于简单、低并发的场景。 非阻塞I/O:程序发起I/O操作时,不会等待,立即返回…...
spring cloud alibaba-dubbo3 rpc运行原理
Dubbo3 运行原理 Dubbo3 是 Apache Dubbo 的最新版本,是一个高性能、轻量级的分布式服务框架,支持微服务架构。相比 Dubbo2,它在协议、扩展性、服务治理、流控等方面做了大量改进,特别是引入了 Triple 协议,使其更加适…...
【Uniapp-Vue3】computed计算属性用法及方法对比
如果我们想要将两个响应式变量进行某种运算,就可以使用computed计算属性。 比如下面这个例子中,输入名和姓合成全名,可以用直接显示的方法: 我们也可以使用computed属性: import {computed} from "vue"; le…...
web实操10——Filter和Listener
Filter介绍 web三大组件:servlet,filter, lisenter。 Filter快速入门 步骤 拦截路径:你访问什么样的资源,过滤器会生效,包括静态资源,动态资源。 配置:两种配置方式 代码实现 代码&#…...
Spring中,出现依赖不完全注入后才执行逻辑
1. Bean生命周期机制 Spring管理的Bean是通过生命周期回调进行初始化和依赖注入的。以下是典型的生命周期阶段: 实例化(Instantiation): 创建Bean对象。依赖注入(Dependency Injection): 向Be…...
如何选择 Dockerfile 的放置方式
是否将 Dockerfile 放在项目根目录下还是为每个应用服务单独创建 Dockerfile,取决于项目架构和使用场景。以下是针对不同项目类型的最佳实践和推荐方式: 一、单体应用项目 项目特点 项目是一个单体应用,只有一个运行环境,例如&a…...
用 HTML5 Canvas 和 JavaScript 实现炫酷跨年烟花特效
一、引言 跨年夜,五彩斑斓、绚丽绽放的烟花是最令人期待的视觉盛宴之一。在网页端,我们能否通过技术手段复现这一梦幻场景呢?答案是肯定的。本文将深入剖析一段使用 HTML5 Canvas 和 JavaScript 实现的跨年烟花特效源码,带你领略前端技术创造的惊艳画面。 用 HTML5 Canvas…...
cat命令详解
🏝️专栏:https://blog.csdn.net/2301_81831423/category_12872319.html 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。” cat 是 Linux/Unix 中的一个非常常用的命令&…...
el-table 自定义表头颜色
第一种方法:计算属性 <template><div><el-table:data"formData.detail"border stripehighlight-current-row:cell-style"{ text-align: center }":header-cell-style"headerCellStyle"><el-table-column fixed…...
window.print()预览时表格显示不全
问题描述:使用element的table组件,表格列宽为自适应,但使用window.print()方法预览的页面会直接按预览宽度截取表格内容进行展示,造成表格可能的显示不全问题 解决方法:添加如下样式 media print {::v-deep {// 表头…...
React Router底层核心原理详解
React Router 是一个功能强大的路由库,它允许开发者在 React 单页面应用(SPA)中实现客户端路由管理。React Router 通过匹配 URL 和组件的关系来实现页面的导航,它不仅提供了简单的 API,还在底层实现了复杂的 URL 匹配…...
linux MySQL 实时性能监控工具
在 Linux 上,有多个工具可以用于 实时监控 MySQL 的性能。根据你的需求,以下是常用的 MySQL 实时性能监控工具,包括轻量级的命令行工具和可视化监控工具。 🔧 1. MySQLTuner – 一键性能优化建议 ✅ 特点 快速分析 MySQL 的性能…...
ModuleNotFoundError: No module named ‘setuptools_rust‘ 解决方案
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
