Linux用docker安装ElasticsearchSpringBoot整合ES

一.  部署Elasticsearch

1. docker查询docker容器中的es

docker search elasticsearch

2.  安装(PS:查看自己的springBoot的版本号  对应的es版本安装

docker pull elasticsearch:7.6.2

3. 查看已安装的docker镜像

docker images

4. 创建挂在目录

mkdir -p /data/elk/es/{config,data,logs}

5. 授权:docker中elasticsearch的用户UID是1000.

chown -R 1000:1000 /data/elk/es

6. 创建挂载配置文件

cd /data/elk/es/config
touch elasticsearch.yml
sudo vi elasticsearch.yml
#[elasticsearch.yml]
cluster.name: "geb-es"
network.host: 0.0.0.0
http.port: 9200

7. 运行elasticsearch

通过镜像,启动一个容器,并将9200和9300端口映射到本机(elasticsearch的默认端口是9200,我们把宿主环境9200端口映射到Docker容器中的4200端口)

docker run -it -d -p 4200:9200 -p 4300:9300 --name es -e ES_JAVA_OPTS="-Xms1g -Xmx1g" -e "discovery.type=single-node" --restart=always -v /date/data/elk/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /date/data/elk/es/data:/usr/share/elasticsearch/data -v /date/data/elk/es/logs:/usr/share/elasticsearch/logs elasticsearch:7.6.2

8. 验证是否安装成功

curl http://localhost:4200

如上   es安装完成。

9. PS: ES的索引类似于milvus中的集合Collection不可重复

             ES可以分不同的索引进行查询  然后不同索引中存储json格式的document文档来存储

二.  SpringBoot整合ES

1. Java  Maven项目中pom.xml引入ES的SDK

还是看springBoot对应的elasticsearch的版本,自行查看~

        <!-- ES 7.6.2 SDK --><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.6.2</version></dependency>

2.  application.yml文件,设置es相关配置

elasticsearch:ip: 10.100.111.11port: 4200

3. 新建ES配置类(实体类略~)

package com.geb.common.config;import org.apache.http.HttpHost;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class ElasticSearchConfig {@Value("${elasticsearch.ip}")private String ip;@Value("${elasticsearch.port}")private Integer port;@Beanpublic RestHighLevelClient restHighLevelClient() {return new RestHighLevelClient(RestClient.builder(new HttpHost(ip, port, "http")));}}

4. Service业务接口处理类

package com.geb.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.geb.domain.IndexText;import java.io.IOException;
import java.util.List;/*** ES公共操作接口 service层* @author jx*/
public interface EsService extends IService<IndexText> {/*** 判断索引库是否存在* @param index* @return*/boolean checkIndexExists(String index) throws IOException;/*** 删除索引* @param index* @return* @throws IOException*/boolean deleteIndex(String index) throws IOException;/*** 批量删除文本文档* @param index* @param idList* @throws IOException*/void deleteDocument(String index, List<Long> idList) throws IOException;/*** 创建Es索引并存入documents数据入文档* @param indexTextList* @param indexName* @throws IOException*/void saveData(List<IndexText> indexTextList, String indexName) throws IOException;/*** 根据keyword查询es相匹配的数据** @param keyword  查询分词器* @param pageNo   当前页* @param pageSize 每页条数* @param indexName 索引名称* @return List<IndexText>*/List<IndexText> search(String keyword, Integer pageNo, Integer pageSize, String indexName) throws Exception ;}

5. Service业务具体实现类

package com.geb.service.impl;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.geb.common.utils.StringUtils;
import com.geb.domain.IndexText;
import com.geb.mapper.WdIndexTextMapper;
import com.geb.service.EsService;
import com.google.common.collect.Lists;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.admin.indices.get.GetIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;/*** ES服务实现类* @author aaa*/
@Slf4j
@Service
@AllArgsConstructor
public class EsServiceImpl extends ServiceImpl<WdIndexTextMapper, IndexText> implements EsService {@Autowiredprivate RestHighLevelClient client;private static final String TEXT = "text";/**************************************************************************** 索引操作 - 类似于milvus中的集合cllection **********************************************************************/// 创建索引public boolean createIndex(String index) throws IOException {CreateIndexRequest request = new CreateIndexRequest(index);CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);System.out.println("索引创建状态: " + createIndexResponse.isAcknowledged());return createIndexResponse.isAcknowledged();}// 检查索引是否存在@Overridepublic boolean checkIndexExists(String index) throws IOException {GetIndexRequest request = new GetIndexRequest();request.indices(index);boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);System.out.println("索引存在: " + exists);return exists;}// 删除索引@Overridepublic boolean deleteIndex(String index) throws IOException {DeleteIndexRequest request = new DeleteIndexRequest(index);AcknowledgedResponse deleteIndexResponse = client.indices().delete(request, RequestOptions.DEFAULT);System.out.println("索引删除状态: " + deleteIndexResponse.isAcknowledged());return deleteIndexResponse.isAcknowledged();}/**************************************************************************** documents操作 - 类似于milvus中的向量数据 **********************************************************************//*** 删除文档* @param index* @param idList* @throws IOException*/@Overridepublic void deleteDocument(String index, List<Long> idList) throws IOException {// 批量删除数据BulkRequest request = new BulkRequest();for (Long id : idList) {request.add(new DeleteRequest().index(index).id(String.valueOf(id)));}BulkResponse response = client.bulk(request, RequestOptions.DEFAULT);}/*** 创建Es索引并存入documents数据入文档* @param indexTextList* @param indexName* @throws IOException*/@Overridepublic void saveData(List<IndexText> indexTextList, String indexName) throws IOException {// 判断该索引是否储存在boolean indexExit = checkIndexExists(indexName);// 不存在则直接创建索引if(!indexExit){createIndex(indexName);}// 存在-则批量存储在该索引中的数据文本document - 从数据库查询所有数据BulkRequest bulkRequest = new BulkRequest(indexName);for (IndexText indexText : indexTextList) {IndexRequest request = new IndexRequest();request.id(indexText.getId().toString());String jsonString = JSON.toJSONString(indexText);request.source(jsonString, XContentType.JSON);bulkRequest.add(request);}BulkResponse responses = client.bulk(bulkRequest, RequestOptions.DEFAULT);System.out.println(responses.status());}/*** 根据keyword查询es相匹配的数据** @param keyword  查询分词器* @param pageNo   当前页* @param pageSize 每页条数* @param indexName 索引名称* @return List<IndexText>*/@Overridepublic List<IndexText> search(String keyword, Integer pageNo, Integer pageSize, String indexName) throws Exception {List<Map<String, Object>> mapList = Lists.newArrayList(); // 获取到的List<Map<String, Object>>对象List<IndexText> resultList = Lists.newArrayList();SearchSourceBuilder builder = new SearchSourceBuilder();builder.from((pageNo - 1) * pageSize);builder.size(pageSize);if (StringUtils.isBlank(keyword)) {  // 根据indexName全量查询该索引中的数据builder.query(QueryBuilders.matchAllQuery());} else {           // 根据keyword分词查询该索引中匹配的数据builder.query(QueryBuilders.matchQuery(TEXT, keyword));}builder.timeout(new TimeValue(60L, TimeUnit.SECONDS));try {SearchResponse response = client.search(new SearchRequest(indexName).source(builder), RequestOptions.DEFAULT);SearchHits responseHits = response.getHits();SearchHit[] hits = responseHits.getHits();if (hits.length > 0) {Arrays.stream(hits).forEach(e -> {
//                    float source = e.getScore();
//                    String sourceAsString = e.getSourceAsString();mapList.add(e.getSourceAsMap());});}// 查询到的es数据Map -> ListJSONArray jsonArray = new JSONArray();jsonArray.addAll(mapList);resultList = jsonArray.toJavaList(IndexText.class);} catch (Exception e) {throw new Exception(e);}return resultList;}}

6. 测试结果查询(可自行编写单元测试/接口测试)

package com.geb.controller;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.geb.common.core.controller.BaseController;
import com.geb.common.domain.R;
import com.geb.domain.IndexText;
import com.geb.domain.dto.VectorTextDataDto;
import com.geb.mapper.WdIndexTextMapper;
import com.geb.service.EsService;
import com.geb.service.IWdKnowledgeBaseService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;import java.io.IOException;
import java.util.List;@RestController
@RequestMapping("/vector")
@Slf4j
public class VectorController extends BaseController {@Autowiredprivate WdIndexTextMapper wdIndexTextMapper;@Autowiredprivate EsService esService;@PostMapping("/saveEsData")@ApiOperation(value = "将用户信息保存进es中")public R<String> saveEsData() throws IOException {List<IndexText> indexTextList = wdIndexTextMapper.selectList(new LambdaQueryWrapper<IndexText>().eq(IndexText::getFileId, 56));esService.saveData(indexTextList, "test-es");return R.ok();}@GetMapping("/searchData/{query}")@ApiOperation(value = "es中查询数据")public R<List<IndexText>> searchData(@PathVariable String query) throws Exception {esService.checkIndexExists("test-es");return R.ok(esService.search(null, 1, 20, "test-es"));}@PostMapping("/createIndex")@ApiOperation(value = "es创建索引")public R<String> createIndex() throws IOException {esService.checkIndexExists("test-es");esService.deleteIndex("test-es");
//        List<Long> idList = new ArrayList<>();
//        idList.add(355L);
//        idList.add(362L);
//        idList.add(361L);
//        idList.add(360L);
//        idList.add(359L);
//        idList.add(358L);
//        esService.deleteDocument("test-es", idList);return R.ok();}
}

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

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

相关文章

2024ciscn初赛——easycms

什么是CMS&#xff1f; CMS是“Content Management System”的缩写&#xff0c;意为“内容管理系统”。网站的开发者为了方便&#xff0c;制作了不同种类的CMS&#xff0c;可以加快网站开发的速度和减少开发的成本。 常见的CMS&#xff1a; php类cms系统&#xff1a;dedecms、…

动态分配函数参数用二级指针的作用

文章目录 前言一、案例 前言 在一些情况下&#xff0c;我们需要在函数内部动态地分配内存来存储结构体&#xff0c;并且需要在函数外部访问该结构体。在这种情况下&#xff0c;可以使用二级指针作为函数参数来实现动态内存分配&#xff0c;并且在函数外部使用指针访问结构体。…

教育数字展馆助力全球教育传播,科技引领数字化教育潮流

一、教育数字展馆助力教育传播 1、提高教育资源的可及性 教育数字展馆通过VR和WEB3D技术&#xff0c;将丰富的教育资源呈现在用户面前。不论是名校的经典课程&#xff0c;还是专家的精彩讲座&#xff0c;均可通过教育数字展馆实现线上展示。用户只需登录平台&#xff0c;即可…

如何利用向量数据库来弥补 LLM 的弱点

向量数据库使企业能够以经济且可持续的方式调整通用大型语言模型以供组织特定使用。 译自 How to Cure LLM Weaknesses with Vector Databases&#xff0c;作者 Naren Narendran。 多年来&#xff0c;人们一直在猜测人工智能对企业产生的潜在影响。现在&#xff0c;我们看到来自…

远程工作/线上兼职网站整理(数字游民友好)

文章目录 国外线上兼职网站fiverrupwork 国内线上兼职网站甜薪工场猪八戒网云队友 国外线上兼职网站 fiverr https://www.fiverr.com/start_selling?sourcetop_nav upwork https://www.upwork.com/ 国内线上兼职网站 甜薪工场 https://www.txgc.com/ 猪八戒网 云队友 …

HarmonyOS 鸿蒙DevEco:导入无法运行提示Sync failed

场景&#xff1a;导入官网下载的案例后导入发现无法运行模拟机&#xff0c;Notifications提示Sync failed... 解决&#xff1a;查看Cause发现是版本问题&#xff0c;通过修改相关内容来解决该问题 1、打开案例地址找到hvigor文件夹 2、打开hvigor-config.json5&#xff0c;将&…

零基础入门学习Python第二阶04SQL详解01

SQL 和 MySQL 详解 SQL 详解 我们通常可以将 SQL 分为四类&#xff0c;分别是 DDL&#xff08;数据定义语言&#xff09;、DML&#xff08;数据操作语言&#xff09;、DQL&#xff08;数据查询语言&#xff09;和 DCL&#xff08;数据控制语言&#xff09;。DDL 主要用于创建…

无需开孔,安全美观:低功耗微波雷达模块开启宠物喂食器新未来

在快节奏的现代生活中&#xff0c;宠物已成为许多家庭的重要成员。然而&#xff0c;忙碌的主人常常为如何确保宠物按时进食而困扰。近年来&#xff0c;智能家居技术飞速发展&#xff0c;宠物喂食器也逐渐智能化&#xff0c;极大地方便了宠物主人。今天&#xff0c;我们要介绍的…

【qt】自定义对话框

自定义对话框 一.自定义对话框的使用1.应用场景2.项目效果3.界面拖放4.模型和视图的设置5.action功能实现 二.自定义对话框的创建1.设置对话框界面2.创建对话框 三.对话框的功能与样式实现1.对话框数据的交换2.对话框的显示3.设置对话框的特性4.完成按钮的功能 四.编辑表头的对…

数组中的第K个最大元素,力扣

目录 题目地址&#xff1a; 我们直接看题解吧&#xff1a; 快速理解解题思路小建议&#xff1a; 审题目事例提示&#xff1a; 解题方法&#xff1a; 解题分析&#xff1a; 解题思路&#xff1a; 题目地址&#xff1a; 215. 数组中的第K个最大元素 - 力扣&#xff08;LeetCode&a…

ChatGPT的逆袭历程:核心技术深度解析

在ChatGPT问世之前&#xff0c;已有许多大模型存在&#xff0c;但为何只有它成为了AI时代的“iPhone时刻”&#xff1f;这不仅得益于其技术优势&#xff0c;还在于其发展过程中所采用的一系列创新策略。本文将深度复盘ChatGPT的逆袭历程&#xff0c;分析其核心技术&#xff0c;…

MySQL数据库--从创建数据库到删库跑路

目录 MySQL安装: 1. 数据库基本操作1.1 创建数据库1.2 显示当前数据库1.3 删除数据库1.4 使用数据库/选中数据库 2. SQL中的数据类型2.1 数值类型2.2 字符串类型2.3 时间类型 3. 表的操作3.2 创建表3.1 显示数据库中的表3.3 查看表的详细情况3.4 删除表3.5 注释3. 修改列(了解即…

数据结构 | 二叉树(基本概念、性质、遍历、C代码实现)

1.树的基本概念 树是一种 非线性 的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。 把它叫做树是因 为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个特殊的结点&#xff0c;称为根…

五分钟“手撕”链表

为了提高大家的学习效率&#xff0c;我把代码放开头&#xff0c;供查阅。 目录 一、链表的实现代码 二、什么是链表 三、链表的分类 四、链表的常见操作 插入 删除 五、Java自带的LinkedList 两个构造方法 一些常用方法 六、LinkedList的遍历 七、ArrayList和Linke…

华媒舍:10种欧洲地区媒体发稿推广技巧

1.了解欧洲地区媒体自然环境必须掌握欧洲地区媒体的发稿推广方法&#xff0c;首先要对欧洲地区媒体自然环境有一定的了解。包含不一样国家的主力媒体&#xff0c;他的阅读者人群、销售市场遮盖及其报导风格等。仅有熟悉媒体自然环境&#xff0c;才能更好的制订营销推广策略。 …

Web----网络通讯部分

一、TCP和UDP的区别 TCP是一种面向连接的协议&#xff0c;它在传输数据之前会建立一条专用的通信连接。这意味着在数据传输过程中&#xff0c;两台计算机之间会有一条稳定的数据传输通道。因此&#xff0c;TCP可以保证数据传输的可靠性&#xff0c;但会带来一定的延迟。 UDP是…

Android VSYNC双Buffer与三Buffer渲染线程RenderThread(5)

Android VSYNC双Buffer与三Buffer渲染线程RenderThread&#xff08;5&#xff09; 手机自带的卡顿丢帧分析工具&#xff0c;柱状图&#xff1a; 帧的大体绘制过程&#xff1a; 帧绘制中的重要概念&#xff1a;BufferQueue 首先看一下 BufferQueue&#xff0c;BufferQueue 是一个…

Visual Studio Code 开发esp8266流程2Arduino 配置 nodemcu

http://arduino.esp8266.com/stable/package_esp8266com_index.json Arduino: Library Manager

第二十五章CSS中的技巧(导航栏、下拉列表)

1.CSS精灵 1.什么是CSS精灵 英文叫法 CSS sprites&#xff0c;通常被解释为“CSS图像拼合”或“CSS贴图定位”;其实就是把网页中一些背景图片整合到一张图片文件中&#xff0c;再利用css“background-image”&#xff0c; “background-repeat”,“background-position”的组…

中国地质大学(武汉):23考研多专业接受调剂,24新增上机考试!中国地质大学(武汉)计算机考研考情分析!

中国地质大学&#xff08;武汉&#xff09;计算机学院成立于1985年&#xff0c;其前身为地矿部武汉计算站。经过近二十年的努力&#xff0c;计算机学院不断发展壮大。现设有计算机应用、计算机软件、网络与系统结构、信息安全四个教研室&#xff1b;拥有湖北省计算机应用技术重…