ElasticSearch安装和部署和整合springboot

news2025/1/16 18:01:42
  • 因为项目每次用到,每次重新搭都踩坑,特此记录一些坑,防止花费大量时间在搭建和整合上面
  • 安装

准备好压缩包elasticsearch-6.2.4解压

  1. 在config文件夹下配置文件elasticsearch.yml,可更改自行喜欢的端口和配置账号密码
  2. 安装中文分词器

 注意分词器版本要和elasticsearch一致

解压后的后的文件夹放入 ES 根目录下的 plugins 目录下,重启 ES 即可使用

Releases · medcl/elasticsearch-analysis-ik · GitHub

二、配置集群

3.1创建 elasticsearch-cluster 文件夹

在内部复制三个 elasticsearch 服务。

3.2修改集群文件目录中每个节点的 config/elasticsearch.yml 配置文件

node-1001 节点

#节点 1 的配置信息:

#集群名称,节点之间要保持一致

cluster.name: my-elasticsearch

#节点名称,集群内要唯一

node.name: node-1001

node.master: true

node.data: true

#ip 地址

#必须要指定ip,若localhost则只能本机访问

network.host: localhost

#http 端口

http.port: 1001

#tcp 监听端口

transport.tcp.port: 9301

#discovery.seed_hosts: ["localhost:9301", "localhost:9302","localhost:9303"]

#discovery.zen.fd.ping_timeout: 1m

#discovery.zen.fd.ping_retries: 5

#集群内的可以被选为主节点的节点列表

#cluster.initial_master_nodes: ["node-1", "node-2","node-3"]

#跨域配置

#action.destructive_requires_name: true

http.cors.enabled: true

http.cors.allow-origin: "*"

node-1002 节点

#节点 2 的配置信息:

#集群名称,节点之间要保持一致

cluster.name: my-elasticsearch

#节点名称,集群内要唯一

node.name: node-1002

node.master: true

node.data: true

#ip 地址

network.host: localhost

#http 端口

http.port: 1002

#tcp 监听端口

transport.tcp.port: 9302

discovery.seed_hosts: ["localhost:9301"]

discovery.zen.fd.ping_timeout: 1m

discovery.zen.fd.ping_retries: 5

#集群内的可以被选为主节点的节点列表

#cluster.initial_master_nodes: ["node-1", "node-2","node-3"]

#跨域配置

#action.destructive_requires_name: true

http.cors.enabled: true

http.cors.allow-origin: "*"

如果有必要,删除每个节点中的 data 目录中所有内容 。防止报错

3.3启动集群

分别依次双击执行节点的bin/elasticsearch.bat, 启动节点服务器(可以编写一个脚本启动),启动后,会自动加入指定名称的集群。

3.4测试集群

一、用Postman,查看集群状态

GET http://127.0.0.1:1001/_cluster/health

GET http://127.0.0.1:1002/_cluster/health

GET http://127.0.0.1:1003/_cluster/health

若有返回则成功

三、分片

四、springboot集成

1.首先在pom.xml添加maven依赖

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>

<!--<version>2.2.6.RELEASE</version>-->

<!--这里可不具体版本,会自动按照springboot版本注入合适版本-->

</dependency>

版本要求具体看官方

Spring Data Elasticsearch - Reference Documentation

2.在springboot配置文件添加

有两种方式

第一种是通过tcp 9300端口连接,这种springboot版本和elasticsearch版本比较兼容

Spring.data.elasticsearch.repositories.enabled= true

Spring.data.elasticsearch.cluster-nodes= 127.0.0.1:9300

Spring.data.elasticsearch.cluster-name=  elasticsearch

这种方式用的是ElasticSearchTemplate

另一种是通过http方式

Spring.elasticsearch.rest.uris= 172.0.11.121:9201

这种方式用的是 ElasticSearchRestTemplate

这种方式,对springboot和elasticsearch的版本必须要符合官方要求

若项目中含有redis依赖

则在启动类添加

System.setProperty("es.set.netty.runtime.available.processors","false");

不使用es的netty,使用redis的。

3.需要存入数据到es的实体类需要添加注解

@Document(indexName = "shopping", shards = 3, replicas = 1,type="product")

//indexName相当于数据库的库名,type 相当于表名

public class Product {

    //必须有 id,这里的 id 是全局唯一的标识,等同于 es 中的"_id"

    @Id

    private Long id;//商品唯一标识



    /**

     * type : 字段数据类型

     * analyzer : 分词器类型

     * index : 是否索引(默认:true)

     * Keyword : 短语,不进行分词

     */

    @Field(type = FieldType.Text, analyzer = "ik_max_word")

    private String title;//商品名称



    @Field(type = FieldType.Keyword)

    private String category;//分类名称



    @Field(type = FieldType.Double)

    private Double price;//商品价格



    @Field(type = FieldType.Keyword, index = false)

    private String images;//图片地址

}

4.配置类

ElasticsearchRestTemplate是spring-data-elasticsearch项目中的一个类,和其他spring项目中的 template类似。

在新版的spring-data-elasticsearch 中,ElasticsearchRestTemplate 代替了原来的ElasticsearchTemplate。

原因是ElasticsearchTemplate基于TransportClient,TransportClient即将在8.x 以后的版本中移除。所以,我们推荐使用ElasticsearchRestTemplate。

ElasticsearchRestTemplate基于RestHighLevelClient客户端的。需要自定义配置类,继承AbstractElasticsearchConfiguration,并实现elasticsearchClient()抽象方法,创建RestHighLevelClient对象。

  1. 需要自定义配置类

继承AbstractElasticsearchConfiguration,并实现elasticsearchClient()抽象方法,创建RestHighLevelClient对象。

import lombok.Data;

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.Configuration;

import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration;



@ConfigurationProperties(prefix = "elasticsearch")

@Configuration

@Data

public class ElasticsearchConfig extends AbstractElasticsearchConfiguration{



    private String host ;

    private Integer port ;

    //重写父类方法

    @Override

    public RestHighLevelClient elasticsearchClient() {

        RestClientBuilder builder = RestClient.builder(new HttpHost(host, port));

        RestHighLevelClient restHighLevelClient = new

                RestHighLevelClient(builder);

        return restHighLevelClient;

    }

}

  1. DAO 数据访问对象
import com.lun.model.Product;

import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

import org.springframework.stereotype.Repository;



@Repository

public interface ProductDao extends ElasticsearchRepository<Product, Long>{



}

  1. crud操作
import com.lun.dao.ProductDao;

import com.lun.model.Product;

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.data.domain.Page;

import org.springframework.data.domain.PageRequest;

import org.springframework.data.domain.Sort;

import org.springframework.test.context.junit4.SpringRunner;



import java.util.ArrayList;

import java.util.List;



@RunWith(SpringRunner.class)

@SpringBootTest

public class SpringDataESProductDaoTest {



    @Autowired

    private ProductDao productDao;

    /**

     * 新增

     */

    @Test

    public void save(){

        Product product = new Product();

        product.setId(2L);

        product.setTitle("华为手机");

        product.setCategory("手机");

        product.setPrice(2999.0);

        product.setImages("http://www.atguigu/hw.jpg");

        productDao.save(product);

    }

    //POSTMAN, GET http://localhost:9200/product/_doc/2



    //修改

    @Test

    public void update(){

        Product product = new Product();

        product.setId(2L);

        product.setTitle("小米 2 手机");

        product.setCategory("手机");

        product.setPrice(9999.0);

        product.setImages("http://www.atguigu/xm.jpg");

        productDao.save(product);

    }

    //POSTMAN, GET http://localhost:9200/product/_doc/2





    //根据 id 查询

    @Test

    public void findById(){

        Product product = productDao.findById(2L).get();

        System.out.println(product);

    }



    @Test

    public void findAll(){

        Iterable<Product> products = productDao.findAll();

        for (Product product : products) {

            System.out.println(product);

        }

    }



    //删除

    @Test

    public void delete(){

        Product product = new Product();

        product.setId(2L);

        productDao.delete(product);

    }

    //POSTMAN, GET http://localhost:9200/product/_doc/2



    //批量新增

    @Test

    public void saveAll(){

        List<Product> productList = new ArrayList<>();

        for (int i = 0; i < 10; i++) {

            Product product = new Product();

            product.setId(Long.valueOf(i));

            product.setTitle("["+i+"]小米手机");

            product.setCategory("手机");

            product.setPrice(1999.0 + i);

            product.setImages("http://www.atguigu/xm.jpg");

            productList.add(product);

        }

        productDao.saveAll(productList);

    }



    //分页查询

    @Test

    public void findByPageable(){

        //设置排序(排序方式,正序还是倒序,排序的 id)

        Sort sort = Sort.by(Sort.Direction.DESC,"id");

        int currentPage=0;//当前页,第一页从 0 开始, 1 表示第二页

        int pageSize = 5;//每页显示多少条

        //设置查询分页

        PageRequest pageRequest = PageRequest.of(currentPage, pageSize,sort);

        //分页查询

        Page<Product> productPage = productDao.findAll(pageRequest);

        for (Product Product : productPage.getContent()) {

            System.out.println(Product);

        }

    }

}

  1. 复杂查询搜索操作
import com.lun.dao.ProductDao;

import com.lun.model.Product;

import org.elasticsearch.index.query.QueryBuilders;

import org.elasticsearch.index.query.TermQueryBuilder;

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.data.domain.PageRequest;

import org.springframework.test.context.junit4.SpringRunner;



@RunWith(SpringRunner.class)

@SpringBootTest

public class SpringDataESSearchTest {



    @Autowired

    private ProductDao productDao;

    /**

     * term 查询

     * search(termQueryBuilder) 调用搜索方法,参数查询构建器对象

     */

    @Test

    public void termQuery(){

        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title", "小米");

                Iterable<Product> products = productDao.search(termQueryBuilder);

        for (Product product : products) {

            System.out.println(product);

        }

    }

    /**

     * term 查询加分页

     */

    @Test

    public void termQueryByPage(){

        int currentPage= 0 ;

        int pageSize = 5;

        //设置查询分页

        PageRequest pageRequest = PageRequest.of(currentPage, pageSize);

        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title", "小米");

                Iterable<Product> products =

                        productDao.search(termQueryBuilder,pageRequest);

        for (Product product : products) {

            System.out.println(product);

        }

    }



}

封装api

:ElasticsearchTemplate的使用 - 简书

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

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

相关文章

git笔记

coderwhy听课笔记 什么是集中式 分布式 集中式是将整个仓库放到服务器&#xff1b;分布式是每台电脑上都有对应的仓库&#xff0c;可以在本地提交&#xff0c;之后把本地的仓库同步到服务器的仓库里 git安装 除了能使用git命令&#xff0c;还安装了git bash,git GUI git ba…

mysql数据库有关教程

我们打开Navicat 我使用的是16版本的,我们选择连接,我们新建连接 这里会有菜单栏目,比如说常规,高级,数据,SSL,SSH HTTP 其他的我们先不看,后期有机会我会解释的,先看常规 连接名字,就是你可以自己命名一个名字,也可以不写,比如说连接名字 studentdemo1 主机默认是localhos…

NetInside网络攻击分析帮您轻松发现可疑主机

分析概要 分析概要从以下三点做介绍。 分析内容 NetInside网络流量分析设备采集的流量。 分析时间 报告分析时间范围为&#xff1a;2020-09-28 07:58:00-11:58:00&#xff0c;时长共计3小时。 分析目的 本报告主要分析目的&#xff1a;查找和定位存在可疑现象的主机、查…

SHELL脚本学习 --- 第二天作业

SHELL脚本学习 — 第二天作业 思路&#xff1a; 这四道题都有条件判断的过程&#xff0c;可以使用if&#xff0c;也可以使用与运算。 linux的shell脚本中&#xff0c;与运算前一个命令执行成功&#xff0c;则执行后一个命令&#xff0c;反之则不执行&#xff0c;因此可以起到类…

cdb.exe的利用

cdb.exe的利用 0x01 简介 cdb 是安装 windows debugging tools 时自带的一个命令行调试工具&#xff0c;由微软签发证书。 0x02 cdb.exe加载shellcode ​ cdb.exe是调试工具&#xff0c;可以用来调试指定进程&#xff0c;并且可以在指定进程里分配RWX属性内存并写入shellcod…

临近年底,如何提高软件项目开发效率和开发速度?

1、任务自动分配功能 提高开发效率 为了提高团队的整个任务分配效率&#xff0c;CoCode自主研发任务“自动规划”功能&#xff0c;会根据当前任务属性以及人员技能登记等信息&#xff0c;实现迭代计划的一键规划&#xff0c;为项目经理智能规划出最优的项目计划以及人员工作安排…

ROS1学习笔记:服务数据的定义与使用(ubuntu20.04)

参考B站古月居ROS入门21讲&#xff1a;服务数据的定义与使用 基于VMware Ubuntu 20.04 Noetic版本的环境 文章目录一、模型图二、创建功能包三、自定义服务数据3.1 在package.xml中添加功能包依赖3.2 在CmakeLists.txt中添加编译选项3.3 编译生成的C文件和Python库四、代码实现…

DSPE-PEG-NPC 二硬脂酰基磷脂酰乙醇胺-聚乙二醇-NPC ;功能聚乙二醇化试剂

DSPE-PEG-NPC 二硬脂酰基磷脂酰乙醇胺-聚乙二醇-NPC 名称&#xff1a;DSPE-PEG-NPC 中文名称&#xff1a;二硬脂酰基磷脂酰乙醇胺-聚乙二醇-NPC 英文&#xff1a;1,2-distearoyl-sn-glycero-3-phosphoethanolamine-N-(polyethylene glycol)-NPC 性状&#xff1a;PEG2000为白色…

高校房产管理平台架构及安全性需求分析

数图互通高校房产综合管理平台是基于公司自主研发的FMCenterV5.0平台&#xff0c;是针对中国高校房产的管理特点和管理要求&#xff0c;研发的一套标准产品&#xff1b;通过在中国100多所高校的成功实施和迭代&#xff0c;形成了一套成熟、完善、全生命周期的房屋资源管理解决方…

Educational Codeforces Round 99 (Rated for Div. 2) D. Sequence and Swaps

翻译&#xff1a; 您将得到一个序列&#x1d44e;&#xff0c;该序列由&#x1d45b;个整数&#x1d44e;1、&#x1d44e;2、…、&#x1d44e;&#x1d45b;和一个整数&#x1d465;组成。您的任务是使序列&#x1d44e;排序(如果条件&#x1d44e;1≤&#x1d44e;2≤&…

java突发内存和CPU同时100%排查解决

问题说明 springBoot 微服务项目&#xff0c;生产环境突然CPU和内存使用率都100%&#xff0c;导致接口请求超时。 初步排查 接口慢首先排除数据库和慢sql的影响&#xff0c;本次问题是所有接口同事慢&#xff0c;不是单个接口&#xff0c;所以不是数据库问题。大面积接口慢很…

【BP靶场-服务端】SQL注入-17个实验

目录 一、SQL意义 1、目的&#xff1a; 2、示例&#xff1a; 二、检索隐藏数据 实验1&#xff1a;隐藏商品 三、颠覆应用程序逻辑 实验2&#xff1a;登陆逻辑 四、从其他数据库表中检索数据 实验3&#xff1a;判断列 实验4&#xff1a;判断字段对应位置 实验5&#…

门控循环单元(GRU)

门控循环神经网络可以更好地捕获时间步距离很长的序列上的依赖关系。 重置门有助于捕获序列中的短期依赖关系。 更新门有助于捕获序列中的长期依赖关系。 重置门打开时&#xff0c;门控循环单元包含基本循环神经网络&#xff1b;更新门打开时&#xff0c;门控循环单元可以跳…

2023年广东数据分析师CPDA认证招生简章(理论+实战)

CPDA数据分析师认证是中国大数据领域有一定权威度的中高端人才认证&#xff0c;它不仅是中国较早大数据专业技术人才认证、更是中国大数据时代先行者&#xff0c;具有广泛的社会认知度和权威性。 无论是地方政府引进人才、公务员报考、各大企业选聘人才&#xff0c;还是招投标加…

Github上排名前五的开源网络监控工具,附详细的图文说明和项目下载地址

Github上排名前五的开源网络监控工具&#xff0c;附详细的图文说明和项目下载地址。 维护网站正常运行是系统管理员最基本的任务之一&#xff0c;所以对系统进行监视&#xff0c;并保持网络的最佳运行状态至关重要。 在现代的网络中&#xff0c;有许多不同的方法来监视&#…

LeetCode刷题之406 根据身高重建队列(贪心算法)

题目描述 假设有打乱顺序的一群人站成一个队列&#xff0c;数组 people 表示队列中一些人的属性&#xff08;不一定按顺序&#xff09;。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi &#xff0c;前面 正好 有 ki 个身高大于或等于 hi 的人。 请你重新构造并返回输入数…

元宇宙数字产品制作厂商广州华锐互动如何?

近两年&#xff0c;元宇宙引发全球的高度关注&#xff0c;很多玩家也都开始参与进来。作为虚拟世界的重要组成部分&#xff0c;元宇宙也从一个概念逐渐演变成了一种全新的商业模式以及行业发展趋势。 元宇宙具有极致沉浸和交互的体验&#xff0c;可以提升生活、工业、社会、科…

云原生之使用Docker部署OneNav个人书签管理器

云原生之使用Docker部署OneNav个人书签管理器一、OneNav介绍1.OneNav简介2.OneNav特点二、检查本地docker环境1.检查docker版本2.检查docker状态三、下载onenav镜像四、部署OneNav应用1.创建数据目录2.创建OneNav容器3.查看OneNav容器状态五、访问OneNav首页六、访问OneNav后台…

难受的这两天,你们怎么样?

12月23号周五&#xff0c;下班回来小云说中午下楼买菜碰到小区认识的一个妈妈&#xff0c;两个人在楼下聊了一会&#xff0c;晚上那个妈妈检测出阳性&#xff0c;周五晚上睡觉前&#xff0c;小云没任何不适&#xff0c;周末看朋友圈和小区已经很多很多人中招&#xff0c;我那时…

大数据系列——什么是hdfs?hdfs用来干什么的?

目录 一、什么是HDFS 二、hdfs用来干什么的 三、hdfs适用场景 四、hdfs不适合的场景 五、hdfs 架构 基本概念 六、HDFS基础命令 七、hdfs业务中应用 一、什么是HDFS HDFS全称是Hadoop Distributed File System是一种分布式文件系统(HDFS使用多台计算机存储文件&#xff…