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.11
  port: 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;

    @Bean
    public 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 {

    @Autowired
    private 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();
    }


    // 检查索引是否存在
    @Override
    public 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;
    }


    // 删除索引
    @Override
    public 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
     */
    @Override
    public 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
     */
    @Override
    public 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>
     */
    @Override
    public 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 -> List
            JSONArray 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 {

    @Autowired
    private WdIndexTextMapper wdIndexTextMapper;

    @Autowired
    private 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();
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

再论Web应用在医学研究中构建数据收集问卷(stremlit_survey包体验)

再论Web应用在医学研究中构建数据收集问卷&#xff08;Streamlit_survey包体验&#xff09; 概述 医学队列研究是临床研究的重要形式&#xff0c;这种研究通过收集临床诊疗过程中产生的数据而阐述疾病相关的因素。在临床数据收集过程中&#xff0c;Web APP体现出了一定的优势…

SpringBoot项目本地运行正常,jar包运行时前端报错403:No mapping for......

SpringBoot项目本地运行正常&#xff0c;jar包运行时前端报错403&#xff1a;No mapping for… 提示&#xff1a;在部署jar包到云服务器上之前&#xff0c;一定要在本地运行jar包&#xff0c;查看前端代码是否运行正常&#xff0c;若报错的话可以节省很多时间 方式&#xff1a;…

Linux命令篇(六):vi/vim专项

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝您生活愉快&#xff01; 文章目录 一、什么是vim二…

弘君资本:如何看待股价波动?

在股票商场上股价的动摇无疑是投资者最为关怀的话题之一&#xff0c;面临股价的起伏不定投资者往往会感到迷茫和焦虑。对于怎么看待股价动摇&#xff0c;弘君资本下面就为我们具体介绍一下。 股价动摇是股市运转的常态&#xff0c;股市是国民经济的晴雨表&#xff0c;股票价格…

关于大模型是否开源的分析

引言 随着科技的迅速发展&#xff0c;大模型技术成为推动人工智能前沿的引擎&#xff0c;而开源与闭源之争成为这场技术风暴中的一道独特风景。特斯拉CEO马斯克的言论将开源的旗帜高高举起&#xff0c;宣示着技术的共享和合作的时代已经来临。然而&#xff0c;在数字化时代&am…

机器视觉检测--光源

一&#xff0c;环形光源 较为常见的LED光源之一&#xff0c;提供基本的照明作用。 随着光源距离产品的工作距离LWD变化而产生的亮度分布&#xff0c;如下图暖色表示亮&#xff1b;冷色表示暗。 同时该图示是针对特定一款大小的环形光源的数据&#xff08;下同&#xff09;。 二…

【二进制部署k8s-1.29.4】八、worker端安装kubelet和cotainerd

文章目录 简介 一.安装containerd1.1.安装containerd1.2.生成containerd配置文件并启动 二.安装kubelet并配置启动文件2.1.准备kubelet配置文件及证书2.2.安装kubelet2.3.配置启动脚步 三.将node节点加入集群注意事项 简介 本章节主要讲解安装containerd和kubelet,containerd主…

【Android】使用EventBus进行线程间通讯

EventBus 简介 EventBus&#xff1a;github EventBus是Android和Java的发布/订阅事件总线。 简化组件之间的通信 解耦事件发送者和接收者 在 Activities, Fragments, background threads中表现良好 避免复杂且容易出错的依赖关系和生命周期问题 Publisher使用post发出…

什么是公有云?与私有云的区别

公有云是指第三方提供商通过公共Internet为用户提供的云服务&#xff0c;用户可以通过Internet访问云并享受各类服务&#xff0c;包括并不限于计算、存储、网络等。公有云服务的模式可以是免费或按量付费。 微 思 | 好 课 推 荐 &#xff08;全国直播&#xff09; 【公有云】华…

Nginx企业级负载均衡:技术详解系列(18)—— 作为上传服务器

你好&#xff0c;我是赵兴晨&#xff0c;97年文科程序员。 在上一期的技术分享中&#xff0c;我们探讨了如何高效搭建Nginx下载服务器&#xff0c;并讨论了长连接优化策略。那么今天&#xff0c;咱们进一步了解Nginx的另一面——作为上传服务器的配置技巧。 作为上传服务器&a…

Ollama 如何排除故障

Ollama 日志 Mac 有时&#xff0c;Ollama 可能无法如你所愿运行。解决问题的一个好方法是查看日志。在 Mac 上&#xff0c;你可以通过运行以下命令来查看日志&#xff1a; cat ~/.ollama/logs/server.logLinux 在使用 systemd 的 Linux 系统上&#xff0c;可以用这个命令查…

Elastic Security 在 AV-Comparatives 的恶意软件防护测试中表现出色

作者&#xff1a;Jamie Hynds, Tamarian Del Conte, Roxana Gheorghe 针对真实恶意软件提供 100% 防护&#xff0c;零误报 Elastic Security 在最近的 AV-Comparatives 恶意软件防护测试中取得了显著的成绩&#xff0c;防护率达到 100%&#xff0c;且对真实恶意软件样本无误报…

Proteus 安装报错There is a problem with this Windows lnstaller package

Proteus 安装常见问题 1.安装秘钥(许可证)的时候报错 报错信息如下所示&#xff1a; There is a problem with this Windows lnstaller package. A program required for this instalt to compiete coutd notbe run,contact your support personnet or packagevendor. 这个是…

通用代码生成器应用场景六,为完善的应用系统收集需求

通用代码生成器应用场景六&#xff0c;为完善的应用系统收集需求 使用急就章功能可以开发一个简单的应用先凑和着使用。此应用系统也可以成为完善的应用系统的原型和祖先。如果您新规划一个完善的应用系统&#xff0c;您可以先使用通用代码生成器生成一个临时使用的系统&#x…

【VAE-base】VAE最简单代码实现(纯全连接层实现变分自编码机)

VAE &#xff08;Variational Autoencoder&#xff09; 代码&#xff1a;https://github.com/AntixK/PyTorch-VAE/blob/master/models/vanilla_vae.py 论文&#xff1a;Auto-Encoding Variational Bayes 核心参考1 https://github.com/lyeoni/pytorch-mnist-VAE/blob/master/p…

IPD推行成功的核心要素(八)市场管理与产品规划保证做正确的事情

产品开发管理是“正确地执行项目”&#xff0c;而市场管理及产品规划关注“执行正确的项目”&#xff0c;可以说后者对产品的成功更为关键。要实现产品的持续成功&#xff0c;还得从源头的市场管理抓起。成功的产品开发&#xff0c;必须面向市场需求&#xff0c;由需求牵引创新…

FlyMcu串口下载STLINK Utility

FlyMcu是串口下载 STLINK Utility是STLINK下载 生成hex文件 打开hex文件&#xff0c;点击开始编程 在编程之前&#xff0c;需要配置BOOT引脚&#xff0c;让STM32执行BootLoader&#xff0c;否则点击开始编程&#xff0c;程序会一直卡住。第一步STM32板上有跳线帽&#xf…

SuperSocket 服务器与客户端双向通讯

1、使用AppSession 的Send方法就可以向连接到的客户端发送数据。服务器端代码如下。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;//引入命名空间 using SuperSocket.Common; using SuperSocket.So…

【机器学习】逻辑回归:原理、应用与实践

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 逻辑回归&#xff1a;原理、应用与实践引言1. 逻辑回归基础1.1 基本概念1.2 Sig…

leetCode-hot100-二分查找专题

二分查找 简介原理分析易错点分析例题33.搜索旋转排序数组34.在排序数组中查找元素的第一个和最后一个位置35.搜索插入位置240.搜索二维矩阵 Ⅱ 简介 二分查找&#xff0c;是指在有序&#xff08;升序/降序&#xff09;数组查找符合条件的元素&#xff0c;或者确定某个区间左右…