elasticsearch集群安装与kibana和spring-boot-starter-data-elasticsearch使用

本文介绍如何从零开始搭建Elasticsearch集群,包括安装配置、防火墙设置及IK分词器安装等步骤,并指导如何使用Spring Boot集成Elasticsearch实现数据索引与查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下载elasticsearch安装包

直接github下载安装包,本次下载的版本elasticsearch-6.8.22.tar.gz
链接

添加用户

添加用户的原因:后面启动ES的时候,无法使用root帐号,所以需要添加其他帐号
添加帐号
useradd es
修改密码
passwd es
修改 /etc/sudoers
root ALL=(ALL) ALL(这行下添加下面一行)
es ALL=(ALL) ALL

安装JDK1.8

直接使用es帐号安装jdk,root帐号执行su es切换到es帐号。(使用root帐号配置,es帐号执行java -version发现找不到命令,因为es帐号没有jdk目录的权限)
在网上找个jdk1.8上传服务器,配置jdk环境变量
编辑此文件加入下面三行JAVA_HOME目录指向你的jdk目录,
vi /etc/profile
编辑完成,重新加载配置
source /etc/profile

export JAVA_HOME=/root/jdk1.8.0_271
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib

安装elasticsearch

直接使用es帐号安装ES(可以使用root帐号su es命令切换到es帐号)
上传elasticsearch-6.8.22.tar.gz至服务器,并且cd到安装目录
进行解压
tar -zxvf elasticsearch-6.8.22.tar.gz
修改解压后的目录为es
mv elasticsearch-6.8.22 elasticsearch

修改ES配置文件
/root/es/elasticsearch/config目录下的jvm.options,将堆内存修改成合适的,
在这里插入图片描述
修改/root/es/elasticsearch/config目录下的elasticsearch.yml
修改或者添加下面配置

#集群名称
cluster.name: chenke-es
#节点名称,每次节点必须设置成不一样
node.name: node-1
#是否能进行主节点选举
node.master: true
#本节点是否存储数据
node.data: true
#数据持久化目录,根据自己挂载空间设置
path.data: /root/es/data
#日志目录,根据自己挂载空间设置
path.logs: /root/es/logs
#是否使用物理内存
bootstrap.memory_lock: true
#本机IP,如果是单IP可以设置成0.0.0.0
network.host: 192.168.38.128
#对外rest接口端口
http.port: 9200
#内部节点通信端口
transport.tcp.port: 9300
#配置集群IP,因为我用的一台服务器部署三个节点,所以需要通过设置http.port,transport.tcp.port端口参数达到目的
#192.168.38.128:9300等于 集群节点IP:transport.tcp.port(参数)
#如果你用多台服务器transport.tcp.port这个参数都可以设置成9300,http.port设置成9200
discovery.zen.ping.unicast.hosts: ["192.168.38.128:9300","192.168.38.128:9301","192.168.38.128:9302"]
#主节点必须最少几个,少于这个数,集群就会挂了。一般是:节点数/2+1,我现在用三个节点所以设置成2
discovery.zen.minimum_master_nodes: 2

集群其他节点服务器先安装jdk,将上面配置完成的ES目录下载到本地。
然后修改/root/es/elasticsearch/config目录下的elasticsearch.yml
只需要修改下面几个配置即可

#节点名称,每次节点必须设置成不一样
node.name: node-1
#本机IP,如果是单IP可以设置成0.0.0.0
network.host: 192.168.38.128

每个节点服务器将9200和9300端口放开,节点之间需要通讯需要服务器之间9300端口互通
firewall-cmd --permanent --zone=public --add-port=9200/tcp && firewall-cmd --reload
firewall-cmd --permanent --zone=public --add-port=9300/tcp && firewall-cmd --reload

每个节点服务器修改/etc/security/limits.conf配置文件,最后面增加下面几行,否则启动ES会报错

*        soft   nproc  819200
*        hard   nproc  819200
*        soft   nofile  819200
*        hard   nofile  819200
*        hard   memlock unlimited
*        soft   memlock unlimited

修改完成后,reboot重启服务器即可。

安装IK分词插件
插件地址,注意版本对照关系,版本不对应会启动报错
因为我装的ES是6.x版本,所以下载的是6.8.22,将elasticsearch-analysis-ik-6.8.22.zip放在/root/es/elasticsearch/plugins目录解压即可

使用前面加的es帐号启动每个节点ES,直接用root帐号启动会报错
进入/root/es/elasticsearch/bin目录

#非后台启动(不能关窗口),第一次启动可以使用此,方便看启动错误
./elasticsearch	
#后台启动
./elasticsearch -d

全部启动完成之后,可以使用http://IP:9200进行访问,如果能访问通说明集群搭建成功了

安装ES可视化界面

下载插件
在这里插入图片描述
谷歌浏览器访问chrome://extensions/
加载程序选择,下载的插件目录即可。
在这里插入图片描述
打开安装的插件,连接之后,显示所有节点
在这里插入图片描述

使用Kibana查询

官方下载地址,下载对应版本。因为只是测试,图方便就下载了windos版本。
解压完只需要修改,下图的配置,对应好自己安装的es。然后进去bin目录启动kibana.bat即可
在这里插入图片描述
文档地址,已经上传到gitee上,建议先把基本语法格式,再去学习spring-boot-starter-data-elasticsearch自定义查询使用会发现格式类似,学习起来容易上手
在这里插入图片描述

spring-boot-starter-data-elasticsearch使用

个人也在熟悉过程中,直接上代码,代码仓库链接
引入坐标,需要和ES版本对应,否则会有各种问题
而且spring-boot-starter-data-elasticsearch3.X版本和spring-boot-starter-data-elasticsearch4.X版本存在一些比较大差异,可能是由于elasticsearch6.x和7.x差异比较大导致。

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

YML配置

elasticsearch:
    rest:
      connection-timeout: 10
      read-timeout: 60
      uris:
        - http://192.168.38.128:9200
        - http://192.168.38.128:9201
        - http://192.168.38.128:9202

新建索引库和操作索引数据需要先新建VO与之对应,为测试尽量会完善所有字段类型和分词

/**
 * 各种字段类型
 *
 * @author chenke
 * @version 1.0
 * @date 2022/5/30 20:47
 */
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Document(indexName = "chenkeindex", shards = 1, replicas = 1)
public class ChenkeIndex {
    @Id
    @Field(type = FieldType.Long)
    private Long blogId;

    /**
     * Text可以分词analyzer = "ik_smart"
     */
    @Field(type = FieldType.Text)
    private String content;

    @Field(type = FieldType.Integer)
    private int status;

    /**
     * Keyword不分词的
     */
    @Field(type = FieldType.Keyword)
    private String type;

    @Field(type = FieldType.Double)
    private Double price;

    /**
     * index = false不需要被索引
     */
    @Field(type = FieldType.Keyword, index = false)
    private String images;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSS")
    @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss.SSS")
    private Date createTime;

}

创建索引方法,注释的为spring-boot-starter-data-elasticsearch4.X版本对应的

@Autowired
    private ElasticsearchRestTemplate esTemplate;

    @Autowired
    private EsChenkeIndex esChenkeIndex;

    /**
     * 创建索引
     */
    @Test
    public void createIndex() {
        esTemplate.deleteIndex(ChenkeIndex.class);
        esTemplate.createIndex(ChenkeIndex.class);
        esTemplate.putMapping(ChenkeIndex.class);

        // ES的版本是elasticsearch-6.8.22,
        // 引用spring-data-elasticsearch 4.x以上版本发现无法创建createMapping,只好还原用3.2.3.RELEASE版本
        //IndexOperations indexOperations = esTemplate.indexOps(ChenkeIndex.class);
        //// indexOperations.delete();
        //indexOperations.createMapping(ChenkeIndex.class);
        //indexOperations.create();
    }

新增索引数据,更新和保存都是对应此方法,ID相同则会更新

/**
     * 新增数据
     */
    @Test
    public void addIndexData() {
        List<ChenkeIndex> list = new ArrayList<>();
        for (int i = 1; i < 11; i++) {
            ChenkeIndex data = ChenkeIndex.builder()
                    .blogId((long) i)
                    .content("测试数据" + i)
                    .status(i)
                    .type("类型" + i)
                    .price((double) i)
                    .images("http://www.aaa.com/" + i)
                    .createTime(new Date())
                    .build();
            list.add(data);
            esChenkeIndex.save(data);
        }

        // 批量插入save和saveAll,主键ID相同则是更新
        // 改变第一条记录ID
        list.get(0).setBlogId(50L);
        esChenkeIndex.saveAll(list);
    }

删除索引

/**
     * 删除索引
     */
    @Test
    public void deleteIndexData() {
        esChenkeIndex.deleteById(1L);
    }

常用基础查询,需要注意方法命名,要遵循类似jpa写法,参考地址

/**
     * 基础查询
     */
    @Test
    public void baseQuery() {
        // 根据ID查询
        Optional<ChenkeIndex> byId = esChenkeIndex.findById(50L);
        byId.ifPresent(System.out::println);

        // 自定义方法查询
        // 方法名称需要按照规定格式才可以。文档提了很多列子,参考即可
        // 参考地址https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#elasticsearch.query-methods.criterions
        // =单个字段值
        List<ChenkeIndex> byStatus = esChenkeIndex.findByStatus(1);
        System.out.println(byStatus);

        // not单个字段
        List<ChenkeIndex> byStatus2 = esChenkeIndex.findByStatusNot(1);
        System.out.println(byStatus2);

        // 按时间查范围
        List<ChenkeIndex> byStatus3 = esChenkeIndex.findByCreateTimeBetween("2021-05-31 13:18:59.262", "2023-05-31 13:18:59.262");
        System.out.println(byStatus3);
    }

自定义查询,这块是重点,本人也在学习过程中,会慢慢完善这块

/**
     * 自定义查询
     */
    @Test
    public void customQuery() {
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
        NativeSearchQuery query = queryBuilder
                .withQuery(QueryBuilders.multiMatchQuery("测试数据", "content"))
                // 分页
                .withPageable(PageRequest.of(0, 5))
                // 根据查询结果按时间升序
                .withSort(SortBuilders.fieldSort("createTime").order(SortOrder.ASC)).build();
        AggregatedPage<ChenkeIndex> chenkeIndices = esTemplate.queryForPage(query, ChenkeIndex.class);
        // 当前页数据
        List<ChenkeIndex> content = chenkeIndices.getContent();
        // 总页数
        int totalPages = chenkeIndices.getTotalPages();
        // 总条数
        long totalElements = chenkeIndices.getTotalElements();
        System.out.println(totalPages);
        System.out.println(content);

        // 自定义查询最常用,还需要详细测试完善
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值