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博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...