SpringCloud保姆级搭建教程六---ElasticSearch

news2024/9/20 14:57:30

es下载地址:https://www.elastic.co/cn/downloads/elasticsearch 最新版本

或者 https://github.com/elastic/elasticsearch 7.17.9

kibana下载地址:https://github.com/elastic/kibana 各个版本

jdk8 对应的es应该是7.*版本,最新的es应该对应的至少得17及以上了

===========================================

es7.17.3版本下载:https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-17-3

kibana最好和es版本相同。

https://www.elastic.co/cn/downloads/past-releases/kibana-7-17-3

版本对应关系参考官网:https://www.elastic.co/cn/support/matrix#matrix_compatibility

因为我电脑上装的还是8,所以下载的还是7.17.3这个版本。

===============================================

1、下载好之后,解压压缩包放到你指定的文件夹下,打开这个路径,双击elasticsearch.bat

双击之后就出现一个黑窗口,等它运行完之后,在浏览器输入localhost:9200,

出现这个界面,就是成功启动了。

2、下载好kibana之后,同样的,解压,然后打开文件夹的这个路径,双击kibana.bat

同样的,等他运行完,在浏览器输入localhost:5601,出现界面之后就是启动成功了。

3、此时此刻,kibana就默认连接上了localhost:9200的ElasticSearch(下面用es代替

除此之外,es之后的使用可能还需要安装分词器,这个windows上安装分词器也是相当的坎坷,客官继续往下看。

这里就不演示坑了,直接说怎么正确的配置

首先第一步,下载与es版本相同的ik分词器 这里下载的是 7.17.3

https://gitcode.net/mirrors/medcl/elasticsearch-analysis-ik/-/releases?after=eyJpZCI6IjU4NDAwNSIsInJlbGVhc2VkX2F0IjoiMjAyMi0wNi0zMCAyMDo0Njo1Ny4wMDAwMDAwMDAgQ1NUIn0

下载完之后解压是这个样子的:

此时此刻,它是不能直接用的,需要编译打包才可以,我这里是用idea打开的,因为我用mvn命令失败了,应该是我没配置的原因。

打开idea,open这个ik分词器的项目,这里要注意一个坑,先打开pom.xml文件,修改一个版本号,这里虽然下载的7.17.3版本的ik分词器,但是在pom.xml中有一个es的版本号并不是这个,如果这里不改,后面仍旧会报错。

将这里的7.16.0修改成7.17.3。

然后依次执行这三个命令:

然后我们就得到了一个target文件夹

进入target文件夹下的releases文件夹,有一个zip后缀的压缩包,将其解压,得到一些文件。

这些才是我们要用的。

然后要做的就是,在es的这个目录下创建的一个名叫ik的空文件夹

然后,将刚才咱们得到的那一堆文件复制过来。

这样就算是大功告成了。

然后重启es,重启kibana ,然后测试一下。

创建这个索引,并指定了ik分词器,提示成功。

然后就可以写DSL语句进行对es进行操作了。

4、DSL语法属于单独一节课了哈,大家可以自行百度学习一下,或者看我的这篇文章,里面也说了DSL的语法。https://blog.csdn.net/weixin_65549694/article/details/125686075

5、下面就是怎么在java中使用了,本文章用Spingboot进行演示。

第一步:引入依赖:.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

第二步:写配置文件,便于使用,在application.yml中写es的ip和端口号

第三步:写配置类,这里用了application.yml中的配置,所以会有一个警告,可以引入一个依赖,去除掉这个警告:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <version>2.4.5</version>
            <!--不传递依赖-->
            <optional>true</optional>
</dependency>

package com.brave.config;

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

@Configuration
@ConfigurationProperties(prefix="elasticsearch")
public class ElasticSearchConfig {

    private String host;

    private int port;


    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }

    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }

    @Bean
    public RestHighLevelClient restHighLevelClient(){
        RestClientBuilder builder = RestClient.builder(new HttpHost(host, port, "http"));
        builder.setRequestConfigCallback(requestConfigBuilder ->{
            requestConfigBuilder.setConnectionRequestTimeout(500000);
            requestConfigBuilder.setSocketTimeout(500000);
            requestConfigBuilder.setConnectTimeout(500000);
            return requestConfigBuilder;
        });
        return new RestHighLevelClient(builder);
    }
}

第四步:可以开始写代码测试了。

我在测试类中进行一系列测试:

package com.brave.test;

//import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.bouncycastle.cert.ocsp.Req;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
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.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
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.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
* @author 泛筱荻
* @version 1.0
* @date 2023/2/16 13:47
*/
@SpringBootTest
    @RunWith(SpringJUnit4ClassRunner.class)
    public class EsTest {

        @Autowired
        private RestHighLevelClient restHighLevelClient;

        /**
* 创建索引
* @throws IOException
*/
        @Test
        public void test1() throws IOException {
            CreateIndexRequest request = new CreateIndexRequest("bravejava1");
            //可以直接做表结构的创建,这里就在kibana中写好语句直接复制mapping后面的语句就好了 || 也可以只创建一个索引
            String info= "{\n" +
                "      \"properties\": {\n" +
                "        \"content\": {\n" +
                "          \"type\": \"text\",\n" +
                "          \"analyzer\": \"ik_max_word\",\n" +
                "          \"search_analyzer\": \"ik_max_word\"\n" +
                "        }\n" +
                "      }\n" +
                "  }";
            request.mapping(info,XContentType.JSON);
            CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
            System.out.println(createIndexResponse.isAcknowledged());
        }

        /**
* 删除索引
* @throws IOException
*/
        @Test
        public void test2() throws IOException {
            DeleteIndexRequest request = new DeleteIndexRequest("bravejava");
            AcknowledgedResponse delete = restHighLevelClient.indices().delete(request, RequestOptions.DEFAULT);
                System.out.println(delete.isAcknowledged());
                }

                /**
                * 判断索引是否存在
                * @throws IOException
                */
                @Test
                public void test3() throws IOException {
                GetIndexRequest request = new GetIndexRequest("bravejava");
                boolean exists = restHighLevelClient.indices().exists(request, RequestOptions.DEFAULT);
                System.out.println(exists);
                }

                /**
                * 新增文档    指定索引,如果索引不存在会自动创建索引
                * @throws IOException
                */
                @Test
                public void test4() throws IOException {
                IndexRequest request = new IndexRequest("bravejava");
                //用map做数据源
                Map<String, Object> map=new HashMap<>();
                map.put("name","李四");
                map.put("age",20);
                map.put("address","北京昌平");
                //        如果想用对象做数据源,可以这样
                //        person.setId("2");
                //        person.setName("李四");
                //        person.setAge(30);
                //        person.setAddress("北京北五环");
                //        String source = JSON.toJSONString(person);
                //        request.id("2").source(source,XContentType.JSON);
                request.id("2").source(map);
                IndexResponse index = restHighLevelClient.index(request, RequestOptions.DEFAULT);
                System.out.println(index.status());
                }

                /**
                * 根据id查询文档
                * @throws IOException
                */
                @Test
                public void test5() throws IOException {
                GetRequest request = new GetRequest("bravejava","1");
                GetResponse getResponse = restHighLevelClient.get(request, RequestOptions.DEFAULT);
                Map<String, Object> sourceAsMap = getResponse.getSourceAsMap();
                System.out.println(sourceAsMap.get("name"));
                System.out.println(sourceAsMap.get("age"));
                System.out.println(sourceAsMap.get("address"));
                //        如果想把map结果传承对应的对象可以这样
                //        Person person = JSONObject.parseObject(JSONObject.toJSONString(source), Person.class);
                }


                /**
                * 根据id删除文档
                * @throws IOException
                */
                @Test
                public void test6() throws IOException {
                DeleteRequest request = new DeleteRequest("bravejava","2");
                DeleteResponse delete = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
                System.out.println(delete.status());
                }


                /**
                * 查询操作  查询操作是最复杂的,其中包括布尔查询,聚合查询,范围查询等等等等。就不一一列举了,具体情况具体再查吧
                * @throws IOException
                */
                @Test
                public void test7() throws IOException {
                SearchRequest request = new SearchRequest("bravejava");
                SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
                //这里分页是从0开始的,如果不写,es也会默认分页,也是十条
                searchSourceBuilder.from(0);
                searchSourceBuilder.size(10);
                request.source(searchSourceBuilder);
                SearchResponse search = restHighLevelClient.search(request, RequestOptions.DEFAULT);
                SearchHits hits = search.getHits();
                SearchHit[] hits1 = hits.getHits();
                for (SearchHit documentFields : hits1) {
                Map<String, Object> sourceAsMap = documentFields.getSourceAsMap();
                //然后做之后的操作,比如转成对象啊,或者做什么别的操作
                System.out.println(sourceAsMap.get("name"));
                System.out.println(sourceAsMap.get("age"));
                System.out.println(sourceAsMap.get("address"));
                }
                System.out.println(search.status());
                }
                }

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

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

相关文章

【论文及代码详解】BEIT: BERT Pre-Training of Image Transformers

记录下论文《BEIT: BERT Pre-Training of Image Transformers》&#xff0c;这是一篇将Transformer应用于图像领域&#xff0c;并使用自监督方法进行参数初始化的文章。 论文链接 整体概要 由于网络整体流程图没有标注好模型的运行过程&#xff0c;结合论文的描述&#xff1a…

收藏,核心期刊的投稿、审稿、出刊流程详解

学术期刊论文&#xff08;核心和普刊&#xff09;的发表流程总的来说其实是一样的&#xff0c;整个流程包括&#xff1a;1写作-2选择刊物-3投稿-4审稿-5返修或拒稿-6录用-7出刊-8上网检索。 其中1和2其实顺序是可以调换的&#xff0c;可以选择好刊物再写作&#xff0c;根据刊物…

麦克风阵列波束基本概念理解

波束形成 本质上是设计合适的滤波器&#xff0c;对于一类固定滤波器系数的阵列来说&#xff0c;无论输入信号或者噪声信号的统计特征如何&#xff0c;其滤波器系数固定不变&#xff0c;此类波束形成叫Fixed Beamforming&#xff0c;固定波束形成好比传统数字信号处理里面的经典…

TCP并发服务器(多进程与多线程)

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 TCP并发服务器&#xff08;多进程与多线程&#xff09;1. 多进程并发服务器&#xff08;1&#xff09;…

NPDP认证|2023年,0基础转行产品经理可以吗?

2023年&#xff0c;告别了疫情&#xff0c;各个行业正在快速回暖&#xff0c;很多企业都在高薪招聘产品经理岗位&#xff0c;这让很多其他岗位的朋友也想转行做产品经理&#xff0c;那没有基础&#xff0c;没有经验能转行做产品经理吗&#xff1f; 0基础转行产品经理是可能的&a…

Redis 删除策略

过期数据Redis中的数据特征 Redis是一种内存级数据库&#xff0c;所有数据均存放在内存中&#xff0c;内存中的数据可以通过TTL指令获取其状态XX &#xff1a;具有时效性的数据-1 &#xff1a;永久有效的数据-2 &#xff1a;已经过期的数据 或 被删除的数据 或 未定义的数据数…

Windows出现0xc00d36e5错误怎么办?

当我们使用Windows Media Player来播放视频文件时&#xff0c;可能会出现无法播放&#xff0c;并显示0xc00d36e5错误代码。该错误可能是因为Windows Media Player不支持视频格式、注册表项损坏、系统配置问题、第三方应用程序冲突等。下面将开始介绍0xc00d36e5错误的解决方法&a…

K_A12_014 基于STM32等单片机驱动S12SD紫外线传感器模块 串口与OLED0.96双显示

K_A12_014 基于STM32等单片机驱动S12SD紫外线传感器模块 串口与OLED0.96双显示一、资源说明二、基本参数参数引脚说明三、驱动说明IIC地址/采集通道选择/时序对应程序:数据对比&#xff1a;四、部分代码说明1、接线引脚定义1.1、STC89C52RCS12SD紫外线传感器模块1.2、STM32F103…

【数据结构】P0 三要素与五个特征

三要素与五个特征什么是数据结构数据结构的三要素逻辑结构存储结构数据的运算算法的五个特征时间复杂度什么是数据结构 数据元素之间存在着一种或者多种关系&#xff0c;这种关系称为结构。 数据结构的三要素 数据结构的三要素&#xff1a;逻辑结构、存储结构、数据的运算。 …

【面试题】手写防抖和节流

1. 手写防抖 debounce 首先介绍一个防抖的应用场景。假如需要监听一个输入框在输入文字后触发的change事件&#xff0c;那么通过keyup事件&#xff0c;每次输入文字后都会触发change事件&#xff0c;频繁触发的情况会影响系统的性能。因此可以使用防抖来降低触发频率&#xff…

flutter系列之:在flutter中使用导航Navigator

文章目录简介flutter中的NavigatorNavigator的使用总结简介 一个APP如果没有页面跳转那么是没有灵魂的&#xff0c;页面跳转的一个常用说法就是Navigator,flutter作为一个最为优秀的前端框架&#xff0c;Navigator肯定是必不可少的&#xff0c;那么在flutter中如何使用Navigat…

自建Git服务器

Gitea - Git with a cup of tea是一个国外团队基于国内一位大牛写的gogs开源项目&#xff08;Go语言开发&#xff09;二次开发的轻量Git社区&#xff0c;其稳定性非常好&#xff0c;而且是非常轻量级在个人亲测在1核1G的centos7主机上1个月不重启依然稳定运行&#xff0c;引用g…

chatgpt怎么去玩?解析各种用途和强大的功能

关于chatgpt怎么玩&#xff1f;他的一些原理以及玩法&#xff0c;相信大家都是挺好奇的吧&#xff0c;毕竟这个新的人工智能和以往我们玩过的&#xff0c;是完全不一样的&#xff0c;它具备更多的可玩性&#xff0c;而且具备有一定的学习能力&#xff0c;这就造就了它的强大&am…

记一次IDE的Docker插件实战(Dockfile篇)

IDEA下使用Docker插件制作镜像、推送及运行 前言 本部分主要根据IDEA的Docker插件实战(Dockerfile篇)_程序员欣宸的博客-CSDN博客_idea编写dockerfile一文所述内容进行实践&#xff0c;并对其中遇到的问题进行解答&#xff0c;从而串接多个知识点。 如何编写Dockfile 在Int…

【elasticsearch】elasticsearch es读写原理

一、前言&#xff1a; 今天来学习下 es 的写入原理。 Elasticsearch底层使用Lucene来实现doc的读写操作&#xff1a; Luence 存在的问题&#xff1a; 没有并发设计 lucene只是一个搜索引擎库&#xff0c;并没有涉及到分布式相关的设计&#xff0c;因此要想使用Lucene来处理海量…

「可信计算」与软件行为学

可信计算组织&#xff08;Ttrusted Computing Group,TCG&#xff09;是一个非盈利的工业标准组织&#xff0c;它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立&#xff0c;并采纳了由可信计算平台联盟&#xff08;the Trusted Computing Platform Alli…

亮个相吧小宝贝儿,五款压箱底的软件

今天要给大家推荐5款压箱底的宝贝软件了&#xff0c;百度搜索一下就能找到下载链接了。 1.开源浏览器——Firefox Firefox是一个自由的&#xff0c;开放源码的浏览器&#xff0c;适用于 Windows, Linux 和 MacOS X平台&#xff0c;Mozilla Firefox官方版体积小速度快&#xf…

【项目】Vue3+TS CMS 登录模块搭建

&#x1f4ad;&#x1f4ad; ✨&#xff1a;Vue3 TS   &#x1f49f;&#xff1a;东非不开森的主页   &#x1f49c;: keep going&#x1f49c;&#x1f49c;   &#x1f338;: 如有错误或不足之处&#xff0c;希望可以指正&#xff0c;非常感谢&#x1f609;   Vue3TS一、…

微服务面试题:熔断和降级有什么区别?

文章目录引言1.概念不同1.1 熔断概念1.2 降级概念2.熔断器模型3.种状态之间的转换关系4.熔断策略5.熔断和降级的关系6.降级方式6.1、熔断降级&#xff08;不可用&#xff09;6.2、超时降级6.3、限流降级7.题外话8.总结引言 熔断和降级都是系统自我保护的一种机制&#xff0c;但…

进阶C语言 第四章-------《自定义类型》 (结构体、枚举、联合)知识点+完整思维导图+深入细节+通俗易懂+基本练习题+建议收藏

绪论 书接上回&#xff0c;通过上章的一些函数&#xff0c;我们可以让我们对于一些数值的调整有很大的帮助&#xff0c;本章自定义类型在C语言中同样也有着非常重要的地位&#xff0c;相信只要认真的阅读了本章&#xff0c;一定会对你有很大的帮助。 所以安全带系好&#xff0c…