微服务es+Kibana解析部署使用全流程

news2024/11/23 11:29:28

1、介绍

ElasticSearch是Java开发的一款开源的,分布式的搜索引擎。

它的搜索采用内存中检索的方式,大大提高了检索的效率,es是基于REST API的方式对数据操作的,可以让存储、检索、索引效率更高。

1、es可以做什么

  • 网站检索数据,比如说购物网站,检索商品名称

  • 搜索引擎模糊查询,比如说百度搜索

  • 等等

    主要就是做数据检索功能的,而且很多时候也会配合关系型数据库或非关系型数据库操作数据。

2、es使用场景

  • 大数据量基础上,数据太少没必要用它

  • 涉及到复杂检索情况

  • 支持对数据的管理,不单单是一个搜索引擎

  • 等等

2、环境搭建

1、下载镜像

#命令1:
docker pull elasticsearch:7.6.2
#命令2:
docker pull kibana:7.6.2

【执行命令1】

【执行命令2】

2、docker配置

1.创建挂载路径

创建两个目录文件,config和data,用来存放配置文件和数据。

2.分配访问权限

chmod -R 777 /usr/local/docker/es/
chmod -R 777 /usr/local/docker/es/config
chmod -R 777 /usr/local/docker/es/data

3.添加访问配置,允许任何ip访问

echo "http.host: 0.0.0.0" > /usr/local/docker/es/config/elasticsearch.yml

vim config/elasticsearch.yml

3、启动ElasticSearch

docker run --name es -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
-v /usr/local/docker/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /usr/local/docker/es/data:/usr/share/elasticsearch/data \
-v /usr/local/docker/es/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.6.2

discovery.type=single-node : 以单节点方式运行

ES_JAVA_OPTS : 设置es的内存,因为es对内存占用比较大,学习时设置小一点方便学习

4、访问es

查看elasticsearch版本信息:http://192.168.142.128:9200/      ip加端口号

5、启动Kibana

docker run --name kibana -e ELASTICSEARCH_HOSTS=http://服务器ip地址:9200 -p 5601:5601 -d kibana:7.6.2           注意ip是自己的

docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.142.128:9200 -p 5601:5601 -d kibana:7.6.2

6、应用Kibana

访问地址:http://192.168.142.128:5601

7、CRUD

使用Kibana代码,来操作es。

# 增  /student/_doc/1  student是表名,_doc是文档类型的记录,1是主键的值;
POST /student/_doc/1
{
  "id":"1",
  "name":"张三",
  "age":21,
  "scoreList":[
    {"id":"1","name":"数学", "score":95},
    {"id":"2","name":"语文", "score":98},
    {"id":"3","name":"外语", "score":90}
  ]
}

POST /student/_doc/2
{
  "id":"2",
  "name":"李四",
  "age":22,
  "scoreList":[
    {"id":"4","name":"数学", "score":85},
    {"id":"5","name":"语文", "score":88},
    {"id":"6","name":"外语", "score":80}
  ]
}

POST /student/_doc/3
{
  "id":"3",
  "name":"王五",
  "age":23,
  "scoreList":[
    {"id":"7","name":"数学", "score":75},
    {"id":"8","name":"语文", "score":78},
    {"id":"9","name":"外语", "score":70}
  ]
}

# 查
GET /student/_doc/3
# 查所有
GET /student/_search    

# 改
PUT /student/_doc/3
{
  "id":"3",
  "name":"王六",
  "age":26,
  "scoreList":[
    {"id":"7","name":"数学", "score":65},
    {"id":"8","name":"语文", "score":78},
    {"id":"9","name":"外语", "score":70}
  ]
}

# 删
DELETE /student/_doc/3

8、分词(了解)

可以安装分词插件,实现分词检索。

3、SpringBoot整合

1、整合方式

1.SpringBoot自带插件(了解)

这种方式比较容易上手,类似于之前学习其它中间件时的XXX-starter的操作,但是更新比较慢,支持的版本较低,功能不够强大。

2.发送请求(整合使用)

任何一个可以发送REST请求的方式都可以请求ES,官方推荐的是Elasticsearch-Rest-Client依赖包,我们采用最多的也是这种方式,帮我们封装了很多的方法。

官网地址: Java High Level REST Client | Java REST Client [7.17] | Elastic

2、Springboot整合Elasticsearch-Rest-Client

1.导入依赖

这里的版本要和所按照的ELK版本匹配。

只接用后面常规依赖

#es依赖:
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
        </exclusion>
    </exclusions>
    <version>7.6.2</version>
</dependency>
<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>7.6.2</version>
</dependency>


#常规依赖:
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.7.RELEASE</version>
    </parent>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.6.13</spring-boot.version>
        <jwt.version>0.7.0</jwt.version>
        <fastjson.version>1.2.60</fastjson.version>
        <spring-cloud-alibaba.version>2.0.3.RELEASE</spring-cloud-alibaba.version>
        <spring-cloud.version>Finchley.SR2</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--json-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.elasticsearch</groupId>
                    <artifactId>elasticsearch</artifactId>
                </exclusion>
            </exclusions>
            <version>7.6.2</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.6.2</version>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <classifier>exec</classifier>
                </configuration>
            </plugin>
        </plugins>
    </build>

2.准备基础类

两个实体类一个启动器

@Data
public class Score {
    private String id;
    private String name;
    private Double score;
}

@Data
public class Student {
    private String id;
    private String name;
    private int age;
    private List<Score> scoreList;

}

@SpringBootApplication
public class SpringBootESMain {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootESMain.class,args);
    }
}

3.准备配置文件

两个配置文件

#application.properties
spring.application.name=demoes

#application.yml
server:
  port: 100

4.编写测试类

(1)填写配置类

配置类中将RestHighLevelClient添加到IoC容器中

package com.jr.config;

import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class EsConfig {

    @Bean
    public RestHighLevelClient restHighLevelClient() {
        RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost("192.168.142.128", 9200, "http"));//注意IP改为自己的
        return new RestHighLevelClient(restClientBuilder);
    }
}
(2)测试

官方文档介绍保存数据功能:

Index API | Java REST Client [7.17] | Elastic

官方文档介绍查询数据功能:

Search API | Java REST Client [7.17] | Elastic

package com.jr;

import com.alibaba.fastjson.JSON;
import com.jr.entry.Score;
import com.jr.entry.Student;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;


@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringBootESMain.class)  // 启动器名
public class EsTest {

    @Autowired
    private RestHighLevelClient client;

    /**
     * 保存数据
     */
    @Test
    public void save() throws IOException {
        /*创建索引名student,student相当于表名,将数据保存到哪里*/
        IndexRequest indexRequest = new IndexRequest("student");
        Student student = new Student();
        student.setAge(20);
        student.setId("5");
        student.setName("钱六");
        Score score1 = new Score();
        score1.setName("数学");
        score1.setScore(89.0);
        score1.setId("shuxue");
        Score score2 = new Score();
        score2.setName("语文");
        score2.setScore(121.0);
        score2.setId("yuwen");
        Score score3 = new Score();
        score3.setName("外语");
        score3.setScore(124.0);
        score3.setId("waiyu");
        List<Score> scoreList = new ArrayList<>();
        scoreList.add(score1);
        scoreList.add(score2);
        scoreList.add(score3);
        student.setScoreList(scoreList);
        /*保存数据也是向es发送了rest请求,保存需要一个json的数据,将对象转化成JSON串*/
        String studentJson = JSON.toJSONString(student);
        //向 Elasticsearch 索引中添加一个文档,其中 studentJson 是要添加的文档的 JSON 格式数据,
        indexRequest.source(studentJson, XContentType.JSON);
        //执行请求,获得响应。
        IndexResponse response = client.index(indexRequest, RequestOptions.DEFAULT);
        System.out.println(response);
    }

    /**
     * 查询数据
     */
    @Test
    public void select() throws IOException {
        SearchRequest searchRequest = new SearchRequest();
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        /*查询的字段要加上keyword,表示按照数据中这个字段值查询,不加就查询不到;id主键除外!*/
        TermQueryBuilder termQuery = QueryBuilders.termQuery("name.keyword", "张三");
        searchSourceBuilder.query(termQuery);
        searchRequest.source(searchSourceBuilder);
        //执行请求,获得响应。
        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println(response);
    }

}

es中,最常用的两个功能就是保存数据和查询数据。它是一个检索引擎,它的作用不是用来存储数据的,而是用来检索数据、搜索数据的。它能帮助咱们快速的去搜索数据,我们往es里放的数据,目的都是为了后面检索能快一点,所以咱们往里放的一般都是查询关键字,再加上关键字对应的id,让es查询这些关键字,找到这些id,把这些id放到项目代码里,然后代码里拿着这些id去关系型数据库或者非关系型数据库里查询这些数据。

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

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

相关文章

python爬虫 - 深入requests模块

&#x1f308;个人主页&#xff1a;https://blog.csdn.net/2401_86688088?typeblog &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html 目录 ​编辑 前言 一、下载网络文件 &#xff08;一&#xff09;基本步骤 &#xff0…

【AIGC】如何选择AI绘画工具?Midjourney VS Stable Diffusion

前言 文章目录 &#x1f4af;如何选择合适的AI绘画工具 个人需求选择比较工具特点社区和资源 &#x1f4af; Midjourney VS Stable Diffusion&#xff1a;深度对比与剖析 使用费用对比使用便捷性与系统兼容性对比开源与闭源对比图片质量对比上手难易对比学习资源对比作品版权问…

Vue入门-指令学习-v-else和v-else-if

v-else和v-else-if 作用&#xff1a;辅助v-if进行判断渲染 语法&#xff1a;v-else v-else-if"表达式" 注意&#xff1a;需要紧挨着v-if一起使用 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><m…

九大排序之插入排序

1.前言 插入排序是把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。实际中我们玩扑克牌时&#xff0c;就用了插入排序的思想。 本章重点&#xff1a;主要着重的介绍两种插入排序…

【JavaEE】【多线程】进程与线程的概念

目录 进程系统管理进程系统操作进程进程控制块PCB关键属性cpu对进程的操作进程调度 线程线程与进程线程资源分配线程调度 线程与进程区别线程简单操作代码创建线程查看线程 进程 进程是操作系统对一个正在运行的程序的一种抽象&#xff0c;可以把进程看做程序的一次运行过程&a…

开发自定义starter

环境&#xff1a;Spring Cloud Gateway 需求&#xff1a;防止用户绕过网关直接访问服务器&#xff0c;用户只需引入依赖即可。 1、创建项目 首先创建一个spring boot项目 2、配置pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xm…

国外电商系统开发-运维系统文件上传

文件上传&#xff0c;是指您把您当前的PC电脑上的文件批量的上传到远程服务器上&#xff0c;在这里&#xff0c;您可以很轻松的通过拖动方式上传&#xff0c;只需要动动鼠标就搞定。 第一步&#xff0c;您应该选择要上传的服务器&#xff1a; 选择好了以后&#xff0c;点击【确…

SpringBoot框架下的教育系统开发全解析

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理微服务在线教育系统的相关信息成为必然。开…

毕业设计项目——基于transformer的中文医疗领域命名实体识别(论文/代码)

完整的论文代码见文章末尾 以下为核心内容 摘要 近年来&#xff0c;随着深度学习技术的发展&#xff0c;基于Transformer和BERT的模型在自然语言处理领域取得了显著进展。在中文医疗领域&#xff0c;命名实体识别(Named Entity Recognition, NER)是一项重要任务&#xff0c;旨…

ArkUI中的状态管理

一、MVVM ArkUI提供了一系列装饰器实现ViewModel的能力,如@Prop、@Link、@Provide、LocalStorage等。当自定义组件内变量被装饰器装饰时变为状态变量,状态变量的改变会引起UI的渲染刷新。 在ArkUI的开发过程中,如果没有选择合适的装饰器或合理的控制状态更新范围,可能会导…

《大规模语言模型从理论到实践》第一轮学习笔记

第一章 绪论 本章主要介绍大规模语言模型基本概念、发展历程和构建流程。 大规模语言模型&#xff08;Large Language Models&#xff0c;LLM&#xff09;&#xff0c;也称大语言模型 或大型语言模型。 1.1 大规模语言模型基本概念 1.语言模型&#xff08;Language Model&a…

重学SpringBoot3-集成Redis(五)之布隆过滤器

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成Redis&#xff08;五&#xff09;之布隆过滤器 1. 什么是布隆过滤器&#xff1f;基本概念适用场景 2. 使用 Redis 实现布隆过滤器项目依赖Redis 配置…

Spring开发最佳实践之跨域处理

1. 跨域处理 1.1 异常现象 1.2 异常原因分析 跨源资源共享的官方定义如下&#xff1a; 跨源资源共享&#xff08;CORS&#xff0c;Cross Origin Resource Sharing。或通俗地译为跨域资源共享&#xff09;是一种基于 HTTP 头的机制&#xff0c;该机制通过允许服务器标示除了它自…

上海理工大学《2023年+2019年867自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《上海理工大学867自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2023年真题 2019年真题 Part1&#xff1a;2023年2019年完整版真题 2023年真题 2019年…

Java使用线程池创建线程

一、线程前言 首先我们知道&#xff0c;线程的概念如果不知道可以去看这一篇Java中的线程&#xff0c;我们这篇主要讲述的是Java怎么使用线程池创建线程&#xff0c;首先我们要对线程池有点概念&#xff0c;其实顾名思义&#xff0c;线程池就是有喝多线程的一个池子类似于&…

一书讲透LLM大语言模型,《掌握大型语言模型》,看完我都懵了!

《掌握大型语言模型》 &#xff08;Mastering Large Language Models&#xff09;由Sanket Subhash Khandare撰写&#xff0c;是一本关于大型语言模型&#xff08;LLMs&#xff09;的高级技术、应用、前沿方法和顶尖模型的指南。 这本大模型书已经上传CSDN&#xff0c;朋友们如…

《Windows PE》4.2 绑定导入表

绑定导入表&#xff08;Bound Import Table&#xff09;是文件中的一个数据结构&#xff0c;用于存储已经绑定&#xff08;即完成绑定导入&#xff09;的外部函数的信息。 本节必须掌握的知识点&#xff1a; 绑定导入表数据结构 实例分析 4.2.1 绑定导入表数据结构 绑定导入…

【AIGC】ChatGPT是如何思考的:探索CoT思维链技术的奥秘

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;什么是CoT思维链CoT思维链的背景与技术发展需求 &#x1f4af;CoT思维链的工作原理&#x1f4af;CoT思维链的应用领域&#x1f4af;CoT思维链的优势&#x1f4af;CoT思维…

动态内存管理笔试题

目录 1.第一题1.1如何修改 2.第二题2.1题想2.2深刻理解 3.第三题4.第四题 1.第一题 void GetMemory(char* p) {p (char*)malloc(100); } void Test(void) {char* str NULL;GetMemory(str);strcpy(str, "hello world");printf(str); }请问运⾏Test 函数会有什么样的…

解锁数字化营销成功密码

在趋势部分&#xff0c;列举了移动优先、社交媒体主导、个性化营销、视频营销崛起和数据驱动决策等方面&#xff0c;让读者快速了解数字化营销的发展方向。策略部分强调了明确目标受众、制定整合营销策略、优化用户体验、重视内容营销和社交媒体营销以及利用搜索引擎优化和数据…