springboot 集成 es--未完结

基于es7.10.x版本

一、前提知识

常见的两种方式:spring boot提供的APIES 官方提供的API

  • ES官方:

    RestHighLevelClient
    适用于复杂、更细粒度控制的Elasticsearch 操作

  • spring boot:
    ElasticsearchRestTemplate:比 RestHighLevelClient 抽象更高,更接近于 Spring Data 的风格,当你想利用 Spring Data 的特性(如查询方法、分页等)与 Elasticsearch 交互时,这是一个很好的选择,但有些复杂查询无法完成。
    ElasticsearchRepository:抽象级别最高,隐藏了与 Elasticsearch 交互的底层细节,并提供了基于方法的查询功能,能够快速实现 CRUD 操作。

建议使用RestHighLevelClient
原因:
版本:ElasticsearchRestTemplate本身与spring-boot-starter-data-elasticsearch紧密依赖。如果想升级ElasticsearchRestTemplate,那就必须连带升级项目的Springboot版本,这个风险就比较高了,一般项目的Springboot版本不会轻易升级
灵活度:比较灵活,可以直接使用ES的DSL语法,实现复杂查询,同时没有与其他部件绑定,所以版本可以自由选择。,由于ElasticsearchRestTemplate是spring-boot-starter-data-elasticsearch封装的工具类,虽然使用上稍微方便一些,但是失去了灵活性,出现问题时也不易排查。

二、环境搭建

1、es 官方

RestHighLevelClient 方式

        <dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.10.0</version></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId><version>7.10.0</version></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.10.0</version></dependency>
spring:elasticsearch:uris: http://172.31.97.4:9280username: xxxxpassword: xxxx

2、springdata

ElasticsearchRestTemplate+ElasticsearchRepository 方式

首先springdata操作es必须要将版本号和es的版本号对应上,否则会报错(倒不用完全一一对应,但版本号最好不要相差太多)。springdata引入的版本号由springboot的版本号决定,对应关系如下:
在这里插入图片描述

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency>
spring:elasticsearch:uris: http://172.31.97.4:9280username: xxxxpassword: xxxx

二、API方法

1、es 官方
工工具类

package com.wang.service;import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.core.CountRequest;
import org.elasticsearch.client.core.CountResponse;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.common.xcontent.json.JsonXContent;
import org.elasticsearch.index.query.AbstractQueryBuilder;
import org.elasticsearch.rest.RestStatus;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @author Spider Man* @date 2024-05-23 15:15*/
@Component
@Slf4j
public class ESUtils {@AutowiredRestHighLevelClient esHighLevelClient;/*** 获取总条数** @param indexName* @return* @throws IOException*/public long getTotalNum(String indexName) throws IOException {CountRequest countRequest = new CountRequest(indexName);// 如果需要,你可以在这里添加查询条件// countRequest.query(QueryBuilders.matchQuery("field_name", "value"));CountResponse countResponse = esHighLevelClient.count(countRequest, RequestOptions.DEFAULT);return countResponse.getCount();}/*** 获取总页数** @param totalNum* @param limit* @return*/public int getTotalPage(long totalNum, int limit) {//总页数return (int) Math.ceil((double) totalNum / limit);}/*** 批量插入数据** @param indexName* @param list* @return boolean*/public boolean multiAddDoc(String indexName, List<JSONObject> list) {try {BulkRequest bulkRequest = new BulkRequest();list.forEach(doc -> {String source = JSONUtil.toJsonStr(doc);IndexRequest indexRequest = new IndexRequest(indexName);indexRequest.source(source, XContentType.JSON);bulkRequest.add(indexRequest);});BulkResponse bulkResponse = esHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);if (bulkResponse.hasFailures()){log.error("批量插入失败,第一条错误原因为 {}",bulkResponse.getItems()[0].getFailureMessage());}else {log.info("批量插入成功,向索引 {} 中批量插入 {} 条数据", indexName, list.size());}return !bulkResponse.hasFailures();} catch (Exception e) {e.printStackTrace();}return false;}/*** 根据id更新文档,全部字段更新** @param indexName* @param docId* @param jsonObject* @return boolean*/public boolean updateDocAllFiled(String indexName, String docId, JSONObject jsonObject) {try {UpdateRequest updateRequest = new UpdateRequest(indexName, docId).doc(JSONUtil.toJsonStr(jsonObject), XContentType.JSON);UpdateResponse updateResponse = esHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);int total = updateResponse.getShardInfo().getTotal();log.info("更新文档的影响数量为{}", total);return total > 0;} catch (Exception e) {e.printStackTrace();}return false;}/*** 局部更新** @param indexName* @param map    key为文档的id,map为所要更新字段的字段名称和值* @return* @throws IOException*/public boolean updateDocSomeFiled(String indexName, Map<String,Map<String, Object>> map) throws IOException {if (CollUtil.isEmpty(map)) {log.info("局部更新数据不能为空");return false;}BulkRequest bulkRequest = new BulkRequest();map.forEach((docId, value) -> {UpdateRequest updateRequest = new UpdateRequest(indexName, docId);updateRequest.doc(value);bulkRequest.add(updateRequest);});if (CollUtil.isNotEmpty(bulkRequest.requests())) {BulkResponse bulkResponse = esHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);if (bulkResponse.hasFailures()) {log.error("更新失败====》" + bulkResponse.buildFailureMessage());return false;}return true;} else {return false;}}/*** 例如:*     TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("ethnic_code.keyword", "汉族");*      Map<String, Object> map = esUtils.conditionSearchBySelfQuery(index, 1, 60, "pat_name",*      termQueryBuilder, "age_year", SortOrder.ASC, null, true);*** 条件搜索分页** @param indexName  索引库* @param pageNum    起始页* @param pageSize   每页大小* @param highName   高亮字段* @param abstractQueryBuilder   搜索条件* @param sortName   排序字段* @param sortOrder  排序类型* @param includes   显示的字段* @param isShowDocumentId  是否显示文档id* @return* @throws IOException*/public Map<String, Object> conditionSearchBySelfQuery(String indexName, Integer pageNum, Integer pageSize, String highName, AbstractQueryBuilder abstractQueryBuilder, String sortName, SortOrder sortOrder, String[] includes, boolean isShowDocumentId) throws IOException {SearchRequest searchRequest = new SearchRequest(indexName);//构造搜索条件SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.fetchSource(includes, null);if (sortName != null && sortOrder != null) {sourceBuilder.sort(sortName, sortOrder);}sourceBuilder.query(abstractQueryBuilder);//高亮处理if (!StrUtil.isEmpty(highName)) {buildHighlight(sourceBuilder, highName);}//分页处理if (pageNum != null && pageSize != null) {sourceBuilder.from(pageSize * (pageNum - 1));sourceBuilder.size(pageSize);}//超时设置sourceBuilder.timeout(TimeValue.timeValueSeconds(60));System.out.println("DSL语句为:\n"+sourceBuilder);searchRequest.source(sourceBuilder);//执行搜索SearchResponse searchResponse = esHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);SearchHits searchHits = searchResponse.getHits();List<JSONObject> resultList = new ArrayList<>();for (SearchHit hit : searchHits) {//原始查询结果数据Map<String, Object> sourceAsMap = hit.getSourceAsMap();if (isShowDocumentId) {sourceAsMap.put("_id", hit.getId());}//高亮处理if (!StrUtil.isEmpty(highName)) {Map<String, HighlightField> highlightFields = hit.getHighlightFields();HighlightField highlightField = highlightFields.get(highName);if (highlightField != null) {Text[] fragments = highlightField.fragments();StringBuilder value = new StringBuilder();for (Text text : fragments) {value.append(text);}sourceAsMap.put(highName, value.toString());}}JSONObject jsonObject = JSONUtil.parseObj(JSONUtil.toJsonStr(sourceAsMap));resultList.add(jsonObject);}long total = searchHits.getTotalHits().value;Map<String, Object> pageMap = new HashMap<>();if (pageNum != null && pageSize != null) {//当前页pageMap.put("pageNum", pageNum);//每页显示条数pageMap.put("pageSize", pageSize);//总页数pageMap.put("totalPage", total == 0 ? 0 : (int) (total % pageSize == 0 ? total / pageSize : (total / pageSize) + 1));}//总条数pageMap.put("totalNum", total);//数据pageMap.put("data", resultList);return pageMap;}/*** 构建高亮字段** @param sourceBuilder* @param highName*/private void buildHighlight(SearchSourceBuilder sourceBuilder, String highName) {HighlightBuilder highlightBuilder = new HighlightBuilder();//设置高亮字段highlightBuilder.field(highName);//多个高亮显示highlightBuilder.requireFieldMatch(false);//高亮标签前缀highlightBuilder.preTags("<span style='color:red'>");//高亮标签后缀highlightBuilder.postTags("</span>");sourceBuilder.highlighter(highlightBuilder);}/*** 根据id删除** @param indexName* @param id*/public void deleteById(String indexName, String id) {DeleteRequest deleteRequest = new DeleteRequest(indexName).id(id);try {DeleteResponse deleteResponse = esHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);if (deleteResponse.status().getStatus() != RestStatus.OK.getStatus()) {log.error(">>>> 删除id={}数据失败,返回状态码={} <<<<", id, deleteResponse.status().getStatus());}} catch (IOException e) {log.error(">>>> 删除数据发生异常,id={},异常信息={} <<<<", id, e.getMessage());}}/*** 根据id查询** @param indexName* @param id* @return*/public Map<String, Object> queryById(String indexName, String id) {GetRequest getRequest = new GetRequest(indexName).id(id);Map<String, Object> map = null;try {GetResponse getResponse = esHighLevelClient.get(getRequest, RequestOptions.DEFAULT);map = getResponse.getSource();} catch (IOException e) {e.printStackTrace();}return map;}/*** 判断索引是否存在** @param indexName 索引名称* @return* @throws IOException*/public boolean indexIsExists(String indexName) throws IOException {GetIndexRequest getIndexRequest = new GetIndexRequest(indexName);return esHighLevelClient.indices().exists(getIndexRequest, RequestOptions.DEFAULT);}public boolean createIndex(String indexName, Map<String, Object> propertyMap) throws IOException {boolean flag = false;if (!indexIsExists(indexName)) {try {CreateIndexRequest index = new CreateIndexRequest("index_name");Map<String, Object> properties = new HashMap<>();Map<String, Object> propertie = new HashMap<>();propertie.put("type", "text");propertie.put("index", true);propertie.put("analyzer", "ik_max_word");properties.put("field_name", propertie);XContentBuilder builder = JsonXContent.contentBuilder();builder.startObject().startObject("mappings").startObject("index_name").field("properties", properties).endObject().endObject().startObject("settings").field("number_of_shards", 3).field("number_of_replicas", 1).endObject().endObject();index.source(builder);esHighLevelClient.indices().create(index, RequestOptions.DEFAULT);flag = true;} catch (IOException e) {e.printStackTrace();throw new RuntimeException("创建索引和映射关系失败");}}return flag;}
}

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

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

相关文章

linux查看是否被入侵(一)

1、查看当前系统状态 [rootbastion-IDC ~]#top #一般挖矿等病毒点用CPU比较大 2、查看当前登录用户(w\who) 3、检查系统日志 检查系统错误登陆日志&#xff0c;统计IP重试次数 [rootbastion-IDC ~]# lastb 4、查看近期用户登录情况 [rootkvm01 ~]# last -n 5 #-n 5 表示…

软件3班20240527

JDK 版本与 Tomcat 的 兼容性

nginx流量监控:goAccess安装与使用

关于goAccess GoAccess 是一款实时、快速的日志分析工具&#xff0c;专门设计用于分析Web服务器日志&#xff0c;特别是Nginx日志。 安装 &#xff08;1&#xff09;准备相关依赖 # Missing development libraries for ncursesw # centOS yum install -y ncurses-devel # U…

【EI会议】2024年互联网技术与环境工程国际会议(IACITEE 2024)

【EI会议】2024年互联网技术与环境工程国际会议&#xff08;IACITEE 2024&#xff09; 2024 International Conference on Internet Technology and Environmental Engineering 互联网技术与环境工程国际会议&#xff08;IACITEE 2024&#xff09;将在重庆举行&#xff0c;主…

怎么把记事本钉在桌面上 桌面记事本固定不动的方法

我的生活&#xff0c;总是被密密麻麻的待办事项和灵感想法填得满满当当。记事本&#xff0c;就是我随身的记忆银行&#xff0c;帮我存储那些稍纵即逝的思维火花和不能错过的琐事提醒。每当翻开那一页页工整的笔记&#xff0c;心中的焦虑和压力似乎都找到了释放的出口。 但一直…

锐捷网络与您相约第七届数字中国建设峰会 共话数字未来

第七届数字中国建设峰会将于5月24日至25日在福建福州举办,本届峰会是国家数据工作体系优化调整后首次举办的数字中国建设峰会,主题是“释放数据要素价值,发展新质生产力”。作为行业领先的ICT基础设施及解决方案提供商,锐捷网络与福建省电子信息集团、星网锐捷,围绕“发展新质生…

mvc的常见注解

问文心一言的&#xff0c;记录一下。 PathVariable 路径变量注解 PathVariable 是 Spring MVC 提供的一个注解&#xff0c;它用于从 URI 模板变量中绑定值到控制器方法的参数上。当你在 RequestMapping、GetMapping、PostMapping、PutMapping、DeleteMapping 等注解的 URL 路…

基于深度学习和opencv的车牌识别系统

免费获取方式↓↓↓ 项目介绍028&#xff1a; 基于深度学习和opencv的车牌识别系统 同时利用对图片每一帧图像加入视频分析模块 图片分析模块可以依据界面按钮提示进行相应功能 视频分析模块可以根据按钮提示进行对视频的分析 &#xff08;视频模块的视频追踪处理时间较长&…

跨平台之用VisualStudio开发APK嵌入OpenCV(一)

序 本篇是杂谈以及准备工作&#xff08;此处应无掌声&#xff09; 暂时不管iOS&#xff08;因为开发hello world都要年费&#xff09; 软件&#xff1a; Visual Studio 2019&#xff08;含Android SDK和NDK编译器等&#xff09; OpenCV 这是一个女仆级的系列文章&#xf…

Lookin高效调试iOS App的UI

Lookin是一款iOS开发时常用的调试软件&#xff0c;由腾讯微信读书团队QMUI开发。 它可以查看和修改iOS App里的UI对象的软件&#xff0c;展示App UI图层&#xff0c;类似于Xcode自带的UI Inspector工具&#xff0c;或另一款叫做Reveal的软件。 此外&#xff0c;虽然Lookin主体…

半年不在csdn写博客,总结一下这半年的学习经历,coderfun的一些碎碎念.

前言 自从自己建站一来&#xff0c;就不在csdn写博客了&#xff0c;但是后来自己的网站因为资金问题不能继续维护下去&#xff0c;所以便放弃了自建博客网站来写博客&#xff0c;等到以后找到稳定&#xff0c;打算满意的工作再来做自己的博客网站。此篇博客用来记录自己在csdn…

PyTorch深度学习快速入门——P1-P13

环境配置 Anaconda&#xff0c;创建conda create -n pytorch python3.12&#xff0c;使用conda activate pytorch切换到环境。安装pytorch&#xff0c;conda install pytorch torchvision torchaudio pytorch-cuda11.8 -c pytorch -c nvidia&#xff0c;使用import torch&…

飞机类设计与实现

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、飞机类属性的定义 三、飞机类方法的创建 四、面向对象的封装特性 五、代码…

buu[HCTF 2018]WarmUp(代码审计)

buu[HCTF 2018]WarmUp&#xff08;代码审计&#xff09; 题目 访问source.php <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist ["source">"source.php","hint">"hint.php…

使用 Ollama框架 下载和使用 Llama3 AI大模型的完整指南

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;AI大模型部署与应用专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年5月24日20点59分 &#x1f004;️文章质量&#xff1a;96分 目录 &#x1f4a5;Ollama介绍 主要特点 主要优点 应…

钕铁硼表面磷化处理

大家都知道烧结钕铁硼易氧化、易腐蚀&#xff0c;日久将造成磁性能的衰减甚至丧失&#xff0c;所以使用前必须进行严格的防腐处理。在之前的文章中已经向大家介绍过与烧结钕铁硼表面处理相关的知识和电镀的工艺流程&#xff0c;除了电镀之外&#xff0c;钕铁硼表面处理还可采用…

电商API接口助力直播带货选品||助力电商平台搭建选品

如今&#xff0c;直播带货如火如荼。直播带货的核心是卖货、品牌盈利&#xff0c;那想要带货效果更好&#xff0c;选品及定价是最关键的环节。 事实上&#xff0c;品牌企业可以直接使用API接口工具来辅助自身选品及定价&#xff0c;这主要是因为比价工具在直播带货选品环节能起…

git 检查用户是否是gitlab用户

背景: 公司代码要从老的git库迁到新的git库&#xff0c;老git库上部分提交用户在新git库上没有&#xff0c;解决方法: 让gitlab不再检查提交用户是否是gitlab用户。具体操作: 去掉下面的勾选&#xff0c;保存配置即可。

乘风破浪,创维汽车旗舰店落户安徽

2024年5月19日&#xff0c;创维汽车宣城家奇体验中心盛大开业。宣城市委办公室副主任师典雅、市投资促进局副局长金崇学、经开区管委会副主任汤晓峰、宣城市通信局局长梁登峰、创维汽车战区总经理刘俊、创维汽车大区总监王大明等人出席此次开业盛典&#xff0c;共同见证了创维汽…

zstd库数据压缩与解压缩

在 Visual Studio 2019 中使用 C 的 zstd 库进行数据压缩与解压缩 在今天的博客中&#xff0c;我们将探讨如何在 Visual Studio 2019 中使用 zstd 库进行高效的数据压缩和解压缩。zstd&#xff08;也称为 Zstandard 或 zstd&#xff09;是由 Facebook 开发的开源压缩库&#x…