如何使用ElasticSearch存储和查询数据
在大多数的场景里,存储数据都是用MySQL这类关系型数据库,这类数据库的特点是数据存储安全性和一致性高,可以用于事务操作,但是随着数据量的增加,查询的速度也会随之降低,并且其扩展能力有限,因此在日志记录和查询等场景下,MySQL就显得力不从心,为了解决对海量数据的搜索、分析和计算,引入ES(ElasticSearch)搜索引擎。
对于IOT领域,记录设备的控制日志非常的有必要,对于客诉排查或者之后的数据分析起着很重要的作用;假如共有100w的设备,一天控制5次,那一年的数据:
100w * 5 * 365 = 9 亿
因此,为了更为较好地存储和查询数据,对于这种大量增加的数据建议用es来存储。
接下来就介绍一下,如何利用SpringBoot框架联合es存储和查询数据。
- 首先引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId><version>2.7.4</version>
</dependency>
通过引入依赖之后,就可以使用SpringBoot提供的ElasticsearchRestTemplate模版类,在该类中有着很多方法,很方便使用。
- 配置文件,配置es连接
server:port: 8080spring:elasticsearch:rest:uris: http://127.0.0.1:9200
# username: #用户名
# password: #密码connection-timeout: 6000read-timeout: 6000
- 接着在使用的地方注入ElasticsearchRestTemplate
@Autowired
ElasticsearchRestTemplate elasticsearchRestTemplate;
- 保存数据,使用es提供save方法
elasticsearchRestTemplate.save(saveBO, getIndex(index_name));// getIndex() 方法
private IndexCoordinates getIndex(String index) {return IndexCoordinates.of(index);
}
在save方法中共有两个入参,第一个参数就是自己想存储的数据,里面的字段根据业务自定义,第二参数就是定义一个在es中的索引,其索引就像MySQL中的表名字。
- 查询es中的数据
public List query(QueryParam queryParam){// 构建查询的条件BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();// 查询条件1:设备idif (!StringUtil.isEmpty(queryParam.getApplianceId())) {queryBuilder.filter(QueryBuilders.termQuery("applianceId.keyword", queryParam.getApplianceId()));}// 查询条件2:时间区效(开始时间&结速时间需同时传输才生效)if (queryParam.getOperateBeginDate() != null && queryParam.getOperateEndDate() != null) {queryBuilder.filter(QueryBuilders.rangeQuery("operateDate").timeZone("Asia/Shanghai") .gte(queryParam.getOperateBeginDate()).lte(queryParam.getOperateEndDate()));}// 实现查询条件组装,设置分页中的起始页和每页大小。NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder().withQuery(queryBuilder).withPageable(PageRequest.of(queryParam.getPageNo(), queryParam.getPageSize())).withSorts(SortBuilders.fieldSort("operateDate").order(SortOrder.DESC)).build();// 使用elasticsearchRestTemplate.search查询数据SearchHits<QueryResult> search = elasticsearchRestTemplate.search(nativeSearchQuery, QueryResult.class, getIndex("index_name"));// 提取其中的数据,提出存储的数据QueryResultList<QueryResult> list = search.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());
}
在查询方法中,首先使用BoolQueryBuilder来构建查询的条件,在代码中使用设备id和时间进行过滤;使用NativeSearchQueryBuilder构建好查询条件、分页和降序排序;接着使用elasticsearchRestTemplate.search()查询结果;最后使用search.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList())对查询的结果进行提取。
通过以上的步骤就可以使用es存储和查询数据,其中elasticsearchRestTemplate集成度高,只需定义好入参和出参即可,其他基本都是模块化操作,非常简单方便。知道了如何使用,其里面的原理也需要了解下,有机会再探索下。
相关文章:
如何使用ElasticSearch存储和查询数据
1. 引言 在大多数的场景里,存储数据都是用MySQL这类关系型数据库,这类数据库的特点是数据存储安全性和一致性高,可以用于事务操作,但是随着数据量的增加,查询的速度也会随之降低,并且其扩展能力有限&#x…...
谈谈对Spring MVC的理解
问题分析: SpringMVC 是一种基于 Java 语言开发,实现了 Web MVC 设计模式,请求驱动类型 的轻量级 Web 框架。 SpringMVC采用了 MVC 架构模式的思想,通过把 Model,View,Controller 分离,将 Web 层…...
Shopify平台Fulfillment业务模块升级
上图是销售订单、发货单与配送之间的关系图,销售订单可以创建多个发货单,多个发货单(不同销售订单)可以合并在一个配送订单进行发货 接口请求错误记录: 1. The api_client does not have the required permission(s). 2. Required parameter missing or…...
使用 PyTorch 逐步检测单个对象
一、说明 在对象检测任务中,我们希望找到图像中对象的位置。我们可以搜索一种类型的对象(单对象检测,如本教程所示)或多个对象(多对象检测)。通常,我们使用边界框定义对象的位置。有几种方法可以…...
Node.js |(二)Node.js API:fs模块 | 尚硅谷2023版Node.js零基础视频教程
学习视频:尚硅谷2023版Node.js零基础视频教程,nodejs新手到高手 文章目录 📚文件写入🐇writeFile 异步写入🐇writeFileSync 同步写入🐇appendFile / appendFileSync 追加写入🐇createWriteStrea…...
Android 13 Hotseat定制化修改——002 hotseat图标数量修改
目录 一.背景 二.实践方案 一.背景 由于需求是需要自定义修改Hotseat,所以此篇文章是记录如何自定义修改hotseat的,应该可以覆盖大部分场景,修改点有修改hotseat布局方向,hotseat图标数量,hotseat图标大小࿰…...
Flask实现接口mock,安装及使用教程(一)
1、什么是接口mock 主要是针对单元测试的应用,它可以很方便的解除单元测试中各种依赖,大大的降低了编写单元测试的难度 2、什么是mock server 正常情况下:测试客户端——测试——> 被测系统 ——依赖——>外部服务依赖 在被测系统和…...
分立式BUCK电路原理与制作持续更新
目录 一、分立式BUCK电路总体原理图 二、BUCK电路与LDO的区别 三、BUCK电路为什么要加电感 四、BUCK电路要加续流二极管 五、BUCK电路导通与断开的回路 六、电源公式的中的几个表示方式 1、输入功率用Pin表示 2、输出功率用Po表示 3、电源的效率公式:电源的…...
2023年大数据与计算国际会议 (WBDC 2023)| EI、Scoups检索
会议简介 Brief Introduction 2023年大数据与计算国际会议(WBDC 2023) 会议时间:2023年11月17 -19日 召开地点:中国西安 大会官网:www.iwbdc.org 2023年大数据与计算国际会议(WBDC 2023)将围绕“…...
Grafana V10 告警推送 邮件
最近项目建设完成,一个城域网项目,相关zabbix和grafana展示已经完,想了想,不想天天看平台去盯网络监控平台,索性对告警进行分类调整,增加告警的推送,和相关部门的提醒,其他部门看不懂…...
【OpenCV常用函数:视频捕获函数】cv2.VideoCapture
文章目录 1、cv2.VideoCapture() 1、cv2.VideoCapture() 输入视频路径,创建VideoCapture的对象 cv2.VideoCapture(filename) filename: 视频文件的路径视频名扩展名该类的函数有: 1)video.isOpened: 检查视频捕获是否成功 2)vid…...
OptaPlanner笔记2
1.5.3 使用maven 修改pom.xml 导入optaplanner-bom以避免为每一个依赖项重复添加版本号 <project>...<dependencyManagement><dependencies><dependency><groupId>org.optaplanner</groupId><artifactId>optaplanner-bom</art…...
c++文件流详细笔记
c++流 IO :向设备输入数据和输出数据 C++的IO流 设备: 文件控制台特定的数据类型(stringstream)c++中,必须通过特定的已经定义好的类, 来处理IO(输入输出) 文件流 文件流: 对文件进行读写操作 头文件: 类库: ifstream 对文件输入(读文件) ofstream 对文件输出(写…...
CNN经典网络模型之GoogleNet论文解读
目录 1. GoogleNet 1.1 Inception模块 1.1.1 1x1卷积 1.2 辅助分类器结构 1.3 GoogleNet网络结构图 1. GoogleNet GoogleNet,也被称为Inception-v1,是由Google团队在2014年提出的一种深度卷积神经网络架构,专门用于图像分类和特征提取任…...
【C++】开源:CGAL计算几何库配置使用
😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍CGAL计算几何库配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,…...
Redis分布式锁相关
Redis分布式锁实现Redisson 15问 分布式锁:Redisson源码解析-MultiLock、RedLock 看懂Redisson分布式锁源码,其实并不难...
Nginx环境搭建以及Docker环境部署
目录 Nginx环境搭建 1.首先创建Nginx的目录并进入 2.下载Nginx的安装包 可以通过FTP工具上传离线环境包,也可通过wget命令在线获取安装包 没有wget命令的可通过yum命令安装 3.解压Nginx的压缩包 4.下载并安装Nginx所需的依赖库和包 安装方式一 安装方式二 --- 也…...
2023牛客暑期多校训练营7(C/I/M)
目录 C.Beautiful Sequence I.We Love Strings M.Writing Books C.Beautiful Sequence 思路:显然若得到了a[1],则整个序列a我们都知道了。所以我们要求出第k大的a[1],这个可以利用序列a为不递减序列的性质来得出。 首先,由题…...
阿里云服务器手动搭建FTP教程(Windows操作系统)
阿里云百科介绍使用阿里云服务器搭建FTP教程,云服务器为Windows操作系统,当需要远程连接Windows实例进行文件传输时,可以通过搭建FTP站点实现。本文将介绍如何在Windows实例中搭建FTP站点。 目录 准备工作 步骤一:添加IIS以及F…...
idea+gradle阅读spring5.2.9源码之源码构建报错解决方案
注意 1、先确保gradle版本和spring、jdk版本对应 本文:gradle:5.6.4/spring 5.2.9/jdk1.8(gradle和jdk都要先安装好,gradle还要配置好本地资源文件路径) 2、原来项目乱了的话,先重新导入下载的源码项目 3、进入源码所在根目录&…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
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打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
