Linux用docker安装ElasticsearchSpringBoot整合ES

ops/2024/10/21 22:49:33/

一.  部署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. 授权:dockerelasticsearch的用户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.ppmy.cn/ops/45531.html

相关文章

VSCode + ESP-IDF 项目搭建及配置

一、安装ESP-IDF 1、乐鑫官网下载安装 ESP-IDF 终端提示 “idf.py build” 安装成功。 2、配置环境变量 此电脑——>属性——>高级系统设置——>环境变量 二、安装 VSCode 1、VS Code 官网下载安装 VS Code 内容忽略&#xff0c;过程全部打勾 2、插件下载 安装插件…

【乐吾乐3D可视化组态编辑器】数据

在属性 - 数据面板中&#xff0c;您可以对操作对象设置数据&#xff0c;我们又称它为动态数据。动态数据主要有以下几个作用&#xff1a; 业务字段扩展。您可以使用动态数据来存储一些业务字段&#xff0c;例如设备名称、编号、规格等等数据。控制对象属性。当动态数据为操作对…

【排序算法】冒泡排序

一、定义&#xff1a; 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单直观的排序算法。重复走访过要排序的元素列&#xff0c;相邻的元素依次比较将无序的一组数据变成有序&#xff08;升序或者降序&#xff09;。走访元素的工作是重复地进行&#xff0c;一直到没有相…

lynis安全漏洞扫描工具

Lynis是一款Unix系统的安全审计以及加固工具&#xff0c;能够进行深层次的安全扫描&#xff0c;其目的是检测潜在的时间并对未来的系统加固提供建议。这款软件会扫描一般系统信息&#xff0c;脆弱软件包以及潜在的错误配置。 安装 方式1 git下载使用git clone https://github…

【C++】【VScode】常用快捷键

在Visual Studio Code (VSCode) 中&#xff0c;有几个快捷键可以帮助你更高效地编写C代码&#xff0c;特别是与代码提示、自动完成等功能相关的快捷键。这些功能大多数依赖于安装和配置好的C/C扩展&#xff08;通常是由Microsoft提供的&#xff09;。以下是几个有助于代码提示和…

OpenCV引入QT编译

OpenCV引入QT编译 为什么要引入QT编译编译方式 Reference: OpenCV 配置选项参考文档 网上实在找不到对应教程&#xff0c;在此做个记录。 为什么要引入QT编译 在没引入QT前&#xff0c;没有上述工具栏。 可以显示当前像素位置的像素值。 可以缩放查看每一个像素的大小。这对…

【Linux】Git超详细教程:手把手教你(gitee版)--版本管理+远程仓库克隆(初学者必看!!!)

目录 一、前言 二、git 的深度理解 &#x1f95d; 什么是 git ? &#x1f347; git 的历史发展&#xff08;理解 git 的由来&#xff09; &#x1f34b; 感性理解 git 的版本管理 三、git 的安装 ✨Window 终端安装 ✨Linux 安装 四、git 的工作流程 五、如何在 Linux …

mysql中的IN和NOT IN

在MySQL中&#xff0c;IN 和 NOT IN 是用于进行集合比较的条件运算符。它们可以用于简化多个 OR 或 AND 条件的查询。这些运算符在查询语句中非常常见&#xff0c;用于检查某个值是否在指定的集合中。 IN 运算符用于检查某个值是否在指定的集合中。NOT IN 运算符用于检查某个值…