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)等技术,帮助开发者快速检索用户基础信息。同时,我们还探讨了如何进行数据统计、聚合查询、多字段匹配等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/742.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java聊天小程序

拟设计一个基于 Java 技术的局域网在线聊天系统,实现客户端与服务器之间的实时通信。系统分为客户端和服务器端两类,客户端用于发送和接收消息,服务器端负责接收客户端请求并处理消息。客户端通过图形界面提供用户友好的操作界面,服务器端监听多个客户端的连接并管理消息通…

【Redis学习 | 第5篇】Redis缓存 —— 缓存的概念 + 缓存穿透 + 缓存雪崩 + 缓存击穿

文章目录 完成任务1. 什么是缓存2. 添加商户缓存3. 缓存更新策略3.1 主动更新 4. 缓存穿透5. 缓存雪崩6. 缓存击穿6.1 使用互斥锁查询商铺信息6.2 使用逻辑过期查询商铺信息 7. 封装 Redis 工具类 完成任务 1. 什么是缓存 缓存:数据交换的缓冲区(Cache…

单元测试概述入门

引入 什么是测试?测试的阶段划分? 测试方法有哪些? 1.什么是单元测试? 单元测试:就是针对最小的功能单元(方法),编写测试代码对其正确性进行测试。 2.为什么要引入单元测试&#x…

微服务的配置共享

1.什么是微服务的配置共享 微服务架构中,配置共享是一个重要环节,它有助于提升服务间的协同效率和数据一致性。以下是对微服务配置共享的详细阐述: 1.1.配置共享的概念 配置共享是指在微服务架构中,将某些通用或全局的配置信息…

基于改进粒子群优化的无人机最优能耗路径规划

目录 1. Introduction2. Preliminaries2.1. Particle Swarm Optimization Algorithm2.2. Deep Deterministic Policy Gradient2.3. Calculation of the Total Output Power of the Quadcopter Battery 3.OptimalEnergyConsumptionPathPlanningBasedonPSO-DDPG3.1.ProblemModell…

HQChart使用教程30-K线图如何对接第3方数据44-DRAWPIE数据结构

HQChart使用教程30-K线图如何对接第3方数据44-DRAWPIE数据结构 效果图DRAWPIEHQChart代码地址后台数据对接说明示例数据数据结构说明效果图 DRAWPIE DRAWPIE是hqchart插件独有的绘制饼图函数,可以通过麦语法脚本来绘制一个简单的饼图数据。 饼图显示的位置固定在右上角。 下…

Wi-Fi Direct (P2P)原理及功能介绍

目录 Wi-Fi Direct (P2P)介绍Wi-Fi Direct P2P 概述P2P-GO(P2P Group Owner)工作流程 wifi-Direct使用windows11 wifi-directOpenwrtwifi的concurrent mode Linux环境下的配置工具必联wifi芯片P2P支持REF Wi-Fi Direct &#xff…

树莓派-5-GPIO的应用实验之GPIO的编码方式和SDK介绍

文章目录 1 GPIO编码方式1.1 管脚信息1.2 使用场合1.3 I2C总线1.4 SPI总线2 RPI.GPIO2.1 PWM脉冲宽度调制2.2 静态函数2.2.1 函数setmode()2.2.2 函数setup()2.2.3 函数output()2.2.4 函数input()2.2.5 捕捉引脚的电平改变2.2.5.1 函数wait_for_edge()2.2.5.2 函数event_detect…

【数据库】四、数据库管理与维护

文章目录 四、数据库管理与维护1 安全性管理2 事务概述3 并发控制4 备份与恢复管理 四、数据库管理与维护 1 安全性管理 安全性管理是指保护数据库,以避免非法用户进行窃取数据、篡改数据、删除数据和破坏数据库结构等操作 三个级别认证: 服务器级别…

Observability:将 OpenTelemetry 添加到你的 Flask 应用程序

作者:来自 Elastic jessgarson 待办事项列表可以帮助管理与假期计划相关的所有购物和任务。使用 Flask,你可以轻松创建待办事项列表应用程序,并使用 Elastic 作为遥测后端,通过 OpenTelemetry 对其进行监控。 Flask 是一个轻量级…

Python双指针

双指针 双指针:在区间操作时,利用两个下标同时遍历,进行高效操作 双指针利用区间性质可以把 O ( n 2 ) O(n^2) O(n2) 时间降低到 O ( n ) O(n) O(n) 反向扫描 反向扫描: l e f t left left 起点,不断往右走&…

python无需验证码免登录12306抢票 --selenium(2)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 [TOC](python无需验证码免登录12306抢票 --selenium(2)) 前言 提示:这里可以添加本文要记录的大概内容: 就在刚刚我抢的票:2025年1月8日…

软件系统安全逆向分析-混淆对抗

1. 概述 在一般的软件中,我们逆向分析时候通常都不能直接看到软件的明文源代码,或多或少存在着混淆对抗的操作。下面,我会实践操作一个例子从无从下手到攻破目标。 花指令对抗虚函数表RC4 2. 实战-donntyousee 题目载体为具有漏洞的小型软…

解决nginx多层代理后应用部署后访问发现css、js、图片等样式加载失败

一般是采用前后端分离部署方式,被上一层ng代理后,通过域名访问报错,例如:sqx.com.cn/应用代理路径。 修改nginx配置,配置前端页面的路径: location / {proxy_pass http://前端页面所在服务器的IP:PORT;pro…

小程序textarea组件键盘弹起会遮挡住输入框

<textarea value"{{remark}}" input"handleInputRemark" ></textarea> 如下会有遮挡&#xff1a; 一行代码搞定 cursor-spacing160 修改后代码 <textarea value"{{remark}}" input"handleInputRemark" cursor-spacin…

1.CSS的复合选择器

1.1 什么是复合选择器 在CSS中&#xff0c;可以根据选择器的类型把选择器分为基础选择器和复合选择器&#xff0c;复合选择器是建立在基础选择器之上&#xff0c;对基础选择器进行组合形成的。 复合选择器可以更精准、更高效的选择目标元素&#xff08;标签&#xff09; 复…

【微服务】面试 2、服务雪崩

服务雪崩概念 主要内容&#xff1a;在微服务项目中&#xff0c;微服务间存在远程调用。若某一服务&#xff08;如服务 d&#xff09;出现故障&#xff0c;调用它的服务&#xff08;如服务 a&#xff09;会失败。若调用方持续向故障服务发起请求&#xff0c;由于服务连接数有限且…

计算机视觉算法实战——车道线检测

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​​​​ ​​​​​​​​​​​​ ​​​​​ 车道线检测是计算机视觉领域的一个重要研究方向&#xff0c;尤其在自动驾驶和高级驾驶辅助…

腾讯云AI代码助手编程挑战赛 - 腾讯云AI代码助手小试

作品简介 本项目基于腾讯云AI代码助手&#xff0c;对平台提供的AI问答应用进行了功能拓展。页面显示采用Vue框架&#xff0c;对话部分使用TDesign组件&#xff0c;模型为hunyuan。主要新增了TDesign页面主题模式改变、页面主题颜色随机切换、文件上传模拟等功能&#xff0c;虽未…

【Web安全】SQL 注入攻击技巧详解:UNION 注入(UNION SQL Injection)

【Web安全】SQL 注入攻击技巧详解&#xff1a;UNION 注入&#xff08;UNION SQL Injection&#xff09; 引言 UNION注入是一种利用SQL的UNION操作符进行注入攻击的技术。攻击者通过合并两个或多个SELECT语句的结果集&#xff0c;可以获取数据库中未授权的数据。这种注入技术要…