ES初使用记录——写入与查询数据

news2024/10/3 4:41:59

本周接到一个任务:定时统计订单表中的数据,将异常订单挑出来,放入ES中供统计页面从总数点击跳转过去进行列表展示。

一、配置ES

配置maven,注入template

@Resource

private ElasticsearchTemplate elasticsearchTemplate;

二、构建实体

其实就是实体类,一般是将业务实体中的部分字段写入ES。

构建IndexQuery(),设置ES的实体类,数据 类型 _doc、索引名

package org.springblade.chargingpile.es.data;

import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.data.elasticsearch.annotations.DateFormat;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

import java.io.Serializable;
import java.util.Date;

/**
 * 异常订单明细信息
 *
 * @date 2022/11/9
 */
@Data
@Document(indexName = "charging_order_exception", type = "_doc")
public class OrderExceptionES implements Serializable {

	@ApiModelProperty("订单编号")
	@Field(type = FieldType.Text)
	private Long id;

	@ApiModelProperty("充电桩编码")
	@Field(type = FieldType.Text)
	private String pileSn;

	@ApiModelProperty("充电枪id")
	@Field(type = FieldType.Text)
	private Long gunId;

	@ApiModelProperty("枪口")
	@Field(type = FieldType.Text)
	private Integer gunPort;

	@ApiModelProperty("结束时间")
	@Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss")
	@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
	private Date endDate;

	@ApiModelProperty("城市代码")
	@Field(type = FieldType.Text)
	private Long cityCode;

	@ApiModelProperty("场站的id")
	@Field(type = FieldType.Text)
	private Long stationId;

	@ApiModelProperty("启动失败次数")
	@Field(type = FieldType.Text)
	private Integer isBootFailure;

	@ApiModelProperty("异常跳枪次数")
	@Field(type = FieldType.Text)
	private Integer isGunFailure;

	@ApiModelProperty("结束原因编码")
	@Field(type = FieldType.Text)
	private String endReason;

	@ApiModelProperty("开始时间")
	@Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss")
	@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
	private Date startDate;
}

三、向ES写入数据

其实这里是两个步骤,ES可以用MySQL来类比,先创建索引(MySQL中的表)再写入数据。

如下方法可以将单个实体类数据写入ES

	@Resource
	private ElasticsearchTemplate elasticsearchTemplate;

	@Override
	public String saveChargingWarnDetailES(ChargingWarnDetailES chargingWarnDetailES) {
		//构建插入数据
		IndexQuery indexQuery = new IndexQuery();
		//插入的实体类
		indexQuery.setObject(chargingWarnDetailES);
		//索引
		indexQuery.setIndexName(WarnConstants.WARN_ES_INDEX);
		//类型
		indexQuery.setType("_doc");
		String index = StringUtils.EMPTY;
		try {
			// 保存数据
			index = elasticsearchTemplate.index(indexQuery);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return index;
	}

四、从ES查询数据

这个步骤问题是比较多的,记录一下。

通过ES查询的字段有:充电场站ID、充电枪ID、时间范围、是否异常订单

同时需要根据时间,也就是ID倒序排列,因为ID是根据时间递增的。

1、构建QueryBuilder,这里用到的是BoolQueryBuilder

        这个BoolQueryBuilder适用于这个场景,是最基本的查询类似于mysql的where条件,条件执行的时候只有true和false这两种结果。must 就类似于 查询条件拼接的 and 字段。

        这里用到的ES时间范围查询,统计从开始到结束时间的订单。用到了rangeQuery("要查询的字段").from("开始时间").to("结束时间”),需要注意的是,这里的要查询的字段要加后缀.keyword,不然查询不出来,时间范围格式和存入时对应,可以用string,因为实体类日期字段标注了格式的

2、构建SearchSourceBuilder

       这里用到的场景是分页、排序。

        ES的查询分页网上主要有三种方法,主要有from..size的浅分页,滑动分页Scroll等。我这里用到的是最简单的浅分页。from参数传入查询数据截取的开始范围,传入前端传过来的(页号-1)*页大小。from + size数值不能超过10000,且是ES查询全部数据再截取得到的效率差了一点点,浅分页就是有这些缺陷。分页要设置searchSourceBuilder.trackTotalHits(true);这样在searchResponse可以通过getTotalHits()得到总的数据量条数。

3、构建SearchRequest 

使用ActionFuture包装的SearchResponse接收返回结果,遍历里面的hit中的对象放入结果集

这里的包装,可以用actionGet()获取到与ES的查询请求结果,为成功再进行下一步。

最终代码如下:

		//构建BoolQueryBuilder 布尔条件查询
		BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
		if (!ObjectUtils.isEmpty(exceptionVO.getIsBootFailure())) {
			boolQueryBuilder.must(QueryBuilders.termsQuery("isBootFailure", new int[]{1}));
		}
		if (!ObjectUtils.isEmpty(exceptionVO.getIsGunFailure())) {
			boolQueryBuilder.must(QueryBuilders.termsQuery("isGunFailure", new int[]{1}));
		}
		if (!ObjectUtils.isEmpty(exceptionVO.getGunId())) {
			boolQueryBuilder.must(QueryBuilders.termsQuery("gunId", new Object[]{exceptionVO.getGunId()}));
		}
		if (!ObjectUtils.isEmpty(exceptionVO.getStart()) && !ObjectUtils.isEmpty(exceptionVO.getEnd())) {
			boolQueryBuilder.must(QueryBuilders.rangeQuery("endDate.keyword").from(exceptionVO.getStart() + " 00:00:00").to(exceptionVO.getEnd() + " 23:59:59"));
		}

		//构建SearchSourceBuilder
		SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
		searchSourceBuilder.trackTotalHits(true);
		if (!ObjectUtils.isEmpty(exceptionVO.getCurrent()) && !ObjectUtils.isEmpty(exceptionVO.getSize())) {
			searchSourceBuilder.from((exceptionVO.getCurrent() - 1) * exceptionVO.getSize());
			searchSourceBuilder.size(exceptionVO.getSize());
		} else {
			searchSourceBuilder.from(0);
			searchSourceBuilder.size(9999);
		}
		searchSourceBuilder.sort("id", SortOrder.DESC);
		searchSourceBuilder.query(boolQueryBuilder);

		//构建SearchRequest
		SearchRequest searchRequest = new SearchRequest("charging_order_exception");
		searchRequest.source(searchSourceBuilder);
		ActionFuture<SearchResponse> searchResponse = elasticsearchTemplate.getClient().search(searchRequest);
		List<OrderExceptionES> list = new LinkedList<>();
		if (searchResponse.actionGet().status().getStatus() == RestStatus.OK.getStatus()) {
			page.setTotal(Long.valueOf(String.valueOf(searchResponse.actionGet().getHits().getTotalHits())));
			SearchHit[] searchHits = searchResponse.actionGet().getHits().getHits();
			for (SearchHit searchHit : searchHits) {
				list.add(JSONObject.parseObject(searchHit.getSourceAsString(), OrderExceptionES.class));
			}
		}

五、其他工具

数据发到ES了,怎么查看。

笔者也是刚结束,下载了官网的kibana但是各种原因没法正常连上使用。

使用谷歌浏览器的插件看看还可以,有ElasticSearchHead

还有ElasticVue

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一、OBS概述

1. 概述 obs官网git源码编译 2. 软件能力 输入&#xff1a;文本、图片、窗口、音视频及摄像头等 处理&#xff1a;视频及图片滤镜、音频混音等 输出&#xff1a;rtmp推流、本地录制(mp4)、音视频裸数据(pcm/yuv/rgb)等 3. 模块 a. core核心模块 libobs 加载、管理各个功能…

Ansys Zemax | 大功率激光系统的STOP分析2:如何进行光机械设计准备

大功率激光器广泛用于各种领域当中&#xff0c;例如激光切割、焊接、钻孔等应用中。由于镜头材料的体吸收或表面膜层带来的吸收效应&#xff0c;将导致在光学系统中由于激光能量吸收所产生的影响也显而易见&#xff0c;大功率激光器系统带来的激光能量加热会降低此类光学系统的…

性能测试面试题总结(答案全)

目录 1.什么是负载测试&#xff1f;什么是性能测试&#xff1f; 2.性能测试包含了哪些测试&#xff08;至少举出3种&#xff09; 3.简述性能测试的步骤 4.什么时候可以开始执行性能测试&#xff1f; 5.你如何在负载测试模式下执行功能测试&#xff1f; 6.响应时间和吞吐量…

时序数据库 InfluxDB

一、介绍 InfluxDB 是一个时间序列数据库&#xff0c;GO 编写的,旨在处理高写入和查询负载。InfluxDB 旨在用作涉及大量时间戳数据的任何用例的后备存储&#xff0c;包括 DevOps 监控、应用程序指标、物联网传感器数据和实时分析。 特点&#xff1a; 专门为时间序列数据编写的…

格式工厂安装与使用教程

格式工厂支持各种类型视频、音频、图片、word转pdf等多种格式的免费转换&#xff0c;是一款非常优秀的良心软件。 在电脑浏览器中打开下载地址http://www.pcgeshi.com/index.html , 单击"立即下载"按钮即可。 打开下载的文件&#xff0c;等待安装即可。&#xff08…

标记肽Bz-Pro-Phe-Arg-pNA、59188-28-2

血浆激肽释放酶&#xff0c;cruppain和胰蛋白酶的显色底物。编号: 140214 中文名称: 标记肽Bz-PFR-对硝基苯胺 英文名: Bz-Pro-Phe-Arg-pNA CAS号: 59188-28-2 单字母: Bz-PFR-pNA 三字母: Benzoyl-Pro-Phe-Arg-pNA 氨基酸个数: 3 分子式: C33H38O6N8 平均分子量: 642.7 精确分…

python 多线程编程(线程同步和守护线程)

守护线程&#xff1a; 随着主线程的终止而终止&#xff0c;不管当前主线程下有多少子线程没有执行完毕&#xff0c;都会终止。 线程同步&#xff1a; join所完成的工作就是线程同步&#xff0c;即主线程任务结束之后&#xff0c;进入阻塞状态&#xff0c;一直等待其他的子线程执…

深入了解tomcat线程池

1.概述 在正式进入Tomcat线程池之前&#xff0c;小伙伴们可以先回顾一下JDK中的线程池相关特性&#xff0c;对于JDK线程池的总结和源码的解析感兴趣的童鞋&#xff0c;也可参考博主的层层剖析线程池源码的这篇文章&#xff0c;文章主要讲述对线程池的生命周期&#xff0c;核心参…

Vue3 - 不再支持 IE11,到底为什么?

前言 咱们的 Vue2 目前仍然支持 IE11&#xff0c;但是到了 Vue3 这里&#xff0c;直接被抛弃了。 IE 浏览器可以说是早期前端开发的噩梦&#xff0c;现在还充斥的大量兼容 IE 浏览器的代码&#xff0c;你可以在网上看到很多类似的信息。 IE 浏览器下 float 布局错乱。IE 浏览器…

商务呈现之沟通管理-上

一、前言 课程目标及适用人群课程目标:商务/项目的目标达成,任务推动,良好的商务呈现 现实的困扰我们商务活动中是否有遇到以下情况: (1)需求老是变 理解不一致细节不清晰(2)CR很难谈 需求基线不清晰没有利用好"交换"(3)原地打转 事项推进缓慢几个月还在讨…

相似度系列-6:单维度方法:Evaluating Coherence in Dialogue Systems using Entailment

Evaluating Coherence in Dialogue Systems using Entailment coherence 英文中意味着连贯性、条理性。 这篇文章是面向对话应用的&#xff0c;更加关注于对话中上下位的连贯性。1. 直接转换为 NLI问题&#xff0c;premise-hypothesis问题。——2. 数据集是自己构造的。——数…

一文带你了解【抽象类和接口】

1. 抽象类概念 在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是并不是所有类都是用来描绘对象的。如果一个类中没有包含足够的信息来描绘一个具体的对象&#xff0c;这样的类就是抽象类。 举个简单的例子 上图中&#xff0c;三角形&#xff0…

构建一个商业智能 BI 分析平台,公司CIO应该重点关注什么?

企业级商业智能 BI 分析平台的构建是一个系统型的工程&#xff0c;涉及业务分析需求的把控、各类数据资源的整合清洗、数据仓库的架构设计、可视化分析报表逻辑设计、IT 部门与业务部门的工作边界划分与配合等等居多环节。 每一个环节的重要性都不容忽视&#xff0c;第一是业务…

(算法设计与分析)第三章动态规划-第二节:动态规划之背包类型问题

文章目录一&#xff1a;01背包问题&#xff08;1&#xff09;题目描述&#xff08;2&#xff09;解题思路&#xff08;3&#xff09;完整代码二&#xff1a;分割等和子集&#xff08;01背包变形&#xff09;&#xff08;1&#xff09;题目描述&#xff08;2&#xff09;解题思路…

Java:Jar包反编译,解压和压缩

1、简述 JAR 文件就是 Java Archive &#xff08; Java 档案文件&#xff09;&#xff0c;它是 Java 的一种文档格式。 JAR 文件非常类似 ZIP 文件。准确的说&#xff0c;它就是 ZIP 文件&#xff0c;所以叫它文件包。JAR 文件与 ZIP 文件唯一的区别就是在 JAR 文件的内容中&a…

蓝桥杯必备算法分享——差分算法

AcWing—差分算法 文章目录AcWing---差分算法一、什么是差分&#xff1f;二、差分的作用三、一维差分模板四、二维差分五、二维差分构造方法图示&#xff1a;六、二维差分矩阵模板总结差分算法是前缀和算法的逆运算。两者可以对比着学习&#xff1a; 一、什么是差分&#xff1…

旭日图超越了传统的饼图和圆环图,能表达清晰的多层级和归属关系

“旭日图是什么&#xff1f;用来干什么&#xff1f;” “没听说过旭日图......” “旭日图不就是多层饼图嘛......” 鉴于很多人对旭日图都不太了解&#xff0c;那今天我们就用平台的旭日图为大家讲解。旭日图看似低调简单&#xff0c;却一点都不简单&#xff01; 旭日图由多…

关于pool.apply_async的学习【参数问题】

一、学习 参考&#xff1a;(1条消息) python pool.apply_async调用 参数为dataset的函数 不执行问题解决_嗯嗲和滴的博客-CSDN博客_pool.apply_async参数 一个参数的情况 一定要加逗号 在只有一个参数要传时 需要写成列表/元组的形式&#xff1a; task_fun.apply_async(args[v…

从零开始学前端:垃圾回收机制,闭包,案例 --- 今天你学习了吗?(JS:Day11)

从零开始学前端&#xff1a;程序猿小白也可以完全掌握&#xff01;—今天你学习了吗&#xff1f;&#xff08;JS&#xff09; 复习&#xff1a;从零开始学前端&#xff1a;作用域、执行顺序 — 今天你学习了吗&#xff1f;&#xff08;JS&#xff1a;Day10&#xff09; 文章目…

网络编程——封装和分用(图解)

一、什么是封装 &#x1f48c;&#x1f48c;&#x1f48c;网络编程中的封装&#xff0c;并不是Java面向对象思想里的封装&#xff0c;继承&#xff0c;多态的封装.它是应用程序通过TCP协议传送数据时&#xff0c;每一次进行包装送入网络中&#xff0c;像极了发快递时的你. 思考…