springboot+mybatisPlus集成ES(RestClient方式)

这篇具有很好参考价值的文章主要介绍了springboot+mybatisPlus集成ES(RestClient方式)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目前springboot整合ES主要有四种方法,分别是TransportClient、RestClient、SpringData-Es、Elasticsearch-SQL。其中官方推荐的是RestClient,本文主要也是说明下RestClient方式的集成,该方式配置同时支持ES单机和ES集群。(MybatisPlus仅在下文的分页查询用到了MybatisPlus的包)
一、环境及版本说明
ES运行方式:ES集群启动(三个节点)
ES组件版本:7.4.2
ES中创建索引:test_index ,包含哪些字段参考下文的实体类TestIndex.java
二、搭建过程
1,pom文件中引入依赖,需要注意:引入的ES依赖版本需要和安装的ES组件版本一致,restClient依赖的版本中包含ES,但是不一定和restClient版本一致,所以需要移除restClient依赖中的ES,然后自己引入ES对应版本的依赖

<!-- Java High Level REST Client -->
<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.4.2</version>
</dependency>

<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>7.4.2</version>
</dependency>

2,yaml配置文件中关于ES的配置

# ElasticSearch配置
es:
  ip: 192.168.1.1,192.168.1.2,192.168.1.3  #ES为集群时多个IP用英文逗号分隔;若为单机时只填写一个IP即可
  port: 9200
  protocal: http
  username: elastic
  password: elastic123

3,SpringBoot项目中关于ES的配置文件

package com.demo.config;

import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
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 ESRestClientConfig {
    @Value("${es.ip}")
    private String esIps;
    @Value("${es.port}")
    private int esPort;
    @Value("${es.protocal}")
    private String protocal;
    @Value("${es.username}")
    private String username;
    @Value("${es.password}")
    private String password;

    @Bean
    public RestHighLevelClient restHighLevelClient() {
        // 1,若有多个从节点可以持续在内部new多个HttpHost,参数1是IP,参数2是端口,参数3是通信协议
        String[] esIpArray = esIps.split(",");
        HttpHost[] httpHostList = new HttpHost[esIpArray.length];
        for (int i=0;i<esIpArray.length;i++) {
            httpHostList[i] = new HttpHost(esIpArray[i],esPort,protocal);
        }

        RestClientBuilder builder = RestClient.builder(httpHostList);
        
        // 2,若存在账号密码,则初始化账号密码
        if(username != null && username != ""){
            final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
            credentialsProvider.setCredentials(AuthScope.ANY,
                    new UsernamePasswordCredentials(username, password));

            builder.setHttpClientConfigCallback((httpClientBuilder) -> {
                httpClientBuilder.disableAuthCaching();
                httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
                return httpClientBuilder;
            });
        }

		// 3, 创建客户端
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(builder);

        return restHighLevelClient;
    }
}

4,ES索引对应实体类创建

package com.demo.domain;

import lombok.Data;
import java.io.Serializable;
import java.util.Date;
import java.util.Map;

@Data
public class TestIndex implements Serializable {
    private static final long serialVersionUID = 3199902908452021663L;
    /**
     * 测试字段1
     */
    private String id;
     /**
     * 测试字段2
     */
    private String endpoint;
    /**
     * 测试字段3
     */
    private String metric;
    /**
     * 测试字段4
     */
    private Date ts;
    /**
     * 测试字段5
     */
    private Integer step;
}

5,ES操作接口及实现

package com.demo.service;

import com.demo.domain.TestIndex ;

import java.io.IOException;

public interface IESOperateService {

    /**
     * 添加索引内容
     * @throws IOException
     */
    public void addIndexData(TestIndex testIndex) throws IOException;

    /**
     * 根据ID删除索引内容
     * @throws IOException
     */
    public void deleteIndexData(String id) throws IOException;

    /**
     * 根据文件ID查询文件
     * @throws IOException
     */
    public TestIndex getIndexDataById(String id) throws IOException;
   
    /**
     * 分页查询索引数据
     */
    public Page<TestIndex> pageIndexData() throws Exception;
}

package com.demo.service;

import com.demo.domain.TestIndex ;
import com.alibaba.fastjson.JSON;
import org.elasticsearch.action.delete.DeleteRequest;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.elasticsearch.action.index.IndexRequest;
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.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.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

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

@Service
public class ESOperateServiceImpl implements IESOperateService {
    // ES中的索引名称
    private static final String INDEX_NAME="test_index";

    @Autowired
    private RestHighLevelClient restHighLevelClient;

    @Override
    public void addIndexData(TestIndex testIndex) throws IOException {
        // IndexRequest
        IndexRequest indexRequest = new IndexRequest(INDEX_NAME);
        String source = JSON.toJSONString(testIndex);
        indexRequest.id(testIndex.getId()).source(source, XContentType.JSON);

        restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
    }


    @Override
    public void deleteIndexData(String id) throws IOException {
        // DeleteRequest
        DeleteRequest deleteRequest = new DeleteRequest(INDEX_NAME, id);

        // 操作ES
        restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
    }

    @Override
    public TestIndex getIndexDataById(String id) throws IOException {
        // SearchRequest
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices(INDEX_NAME);

        // 构建检索条件
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        // 根据字段匹配
        QueryBuilder queryBuilder = QueryBuilders.matchQuery("id",id);
        searchSourceBuilder.query(queryBuilder);
        searchRequest.source(searchSourceBuilder);

        // 查询ES
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits hits = searchResponse.getHits();

        // 遍历封装列表对象
        List<TestIndex> testIndexList = new ArrayList<>();
        SearchHit[] searchHits = hits.getHits();
        for (SearchHit searchHit : searchHits) {
            testIndexList.add(JSON.parseObject(searchHit.getSourceAsString(), TestIndex.class));
        }

        if (!CollectionUtils.isEmpty(testIndexList )) {
            return testIndexList .get(0);
        } else {
            return null;
        }
    }

	 @Override
    public Page<TestIndex> pageIndexData() throws Exception {
        // SearchRequest
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices(INDEX_NAME);

        // 设置分页,含尾不含头(例如第一页为0-10,第二页为10-20)
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.from(0);  // 起始位置
        searchSourceBuilder.size(10); // 结束位置

        // 根据字段匹配
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.must(QueryBuilders.matchQuery("metric", "testMetric"));

		// 时间范围匹配,相当于between and ,因ES中日期数据为格林威治时间格式,故需要将日期转为格林威治时间格式
        Date currentDate = new Date();
        String beginTs = DateUtil.beginOfMonth(currentDate).toString().replace(" ","T");
        String endTs = DateUtil.endOfMonth(currentDate).toString().replace(" ","T");
        QueryBuilder queryBuilder = QueryBuilders.rangeQuery("ts").from(beginTs).to(endTs);
        boolQueryBuilder.must(queryBuilder);

        // 模糊匹配
        QueryBuilder queryBuilder1 = QueryBuilders.wildcardQuery("endpoint", ("*test*"));
        boolQueryBuilder.must(queryBuilder1);

        // 放开分页查询最多10000条的限制,ES默认最多能10000条数据,若需要解除限制,下面配置设为true即可
        // 需要注意的是:放开ES最大返回值的限制后,相当于深度分页了,对于ES的性能有很大影响,需慎重使用
        searchSourceBuilder.trackTotalHits(true);
		
		// 结果排序
        searchSourceBuilder.query(boolQueryBuilder).sort("ts", SortOrder.DESC);
        searchRequest.source(searchSourceBuilder);

        // 执行ES查询动作
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits hits = searchResponse.getHits();

        // 遍历封装列表对象
        List<TestIndex> testIndexList = new ArrayList<>();
        SearchHit[] searchHits = hits.getHits();
        for (SearchHit searchHit : searchHits) {
            testIndexList.add(JSON.parseObject(searchHit.getSourceAsString(), TestIndex.class));
        }

        Page<TestIndex> pageDto = new Page();
        // 设置当前页码,我这里是写死的分页数据,应用到实际项目还是需要动态传入参数的
        pageDto.setCurrent(1).setRecords(testIndexList).
                setTotal(hits.getTotalHits().value).setSize(10);

        return pageDto;
    }
}

6,ES操作controller层实现测试代码文章来源地址https://www.toymoban.com/news/detail-517927.html

package com.demo.controller;

import com.demo.service.IESOperateService;
import com.demo.domain.TestIndex;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
public class ESController
{
    @Autowired
    private IESOperateService esOperateService;

    @GetMapping("/addIndexData")
    public void addIndexData() {
 		TestIndex testIndex= new TestIndex();
        testIndex.setId("123456789");
        testIndex.setMetric("testMetric");
        testIndex.setEndpoint("testEndpoint");
        testIndex.setStep(100);

        esOperateService.addIndexData(testIndex);            
    }

    // 控制层调用service接口比较简单,就不一一都写出来了,测试话都可以参考上例
}

到了这里,关于springboot+mybatisPlus集成ES(RestClient方式)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • elasticsearch(ES)分布式搜索引擎03——(RestClient查询文档,ES旅游案例实战)

    文档的查询同样适用昨天学习的 RestHighLevelClient对象,基本步骤包括: 1)准备Request对象 2)准备请求参数 3)发起请求 4)解析响应 我们以match_all查询为例 3.1.1.发起查询请求 代码解读: 第一步,创建 SearchRequest 对象,指定索引库名 第二步,利用 request.source() 构建DSL,DSL中可

    2024年02月07日
    浏览(53)
  • 【工作记录】springboot集成spring-data-elasticsearch访问es及问题解决

    ​ 前文我们介绍了通过可视化爬虫爬取新闻到Mysql库、基于docker-compose的elk集群部署及抽取mysql数据到es的过程,本文我们介绍通过集成springboot和spring-data-elasticsearch客户端完成连接es并查询数据的开发过程以及遇到的问题和解决方案,希望对大家能有所帮助,对文中内容有任何

    2023年04月10日
    浏览(40)
  • 华为云Elasticsearch(FusionInsight HD)连接和开发教程03-通过HighLevel RestClient操作ES

    通过典型场景,我们可以快速学习和掌握Elasticsearch的开发过程,并且对关键的接口函数有所了解。 场景说明 假定用户开发一个应用程序,用于搜索所有图书信息,并要求提供搜索相关的图书,并打分按分排序,其中搜索的功能就可以用Elasticsearch来实现,搜索流

    2024年02月02日
    浏览(39)
  • ElasticSearch基础1——索引和文档。Kibana,RestClient操作索引和文档+黑马旅游ES库导入

    导航: 【黑马Java笔记+踩坑汇总】JavaSE+JavaWeb+SSM+SpringBoot+瑞吉外卖+SpringCloud/SpringCloudAlibaba+黑马旅游+谷粒商城 黑马旅游源码:  https://wwmg.lanzouk.com/ikjTE135ybje 目录 1.初识弹性搜索elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 1.1.2.ELK弹性栈 1.1.3.elasticsearch和lucene 1.1.4.搜索引擎技术

    2024年02月01日
    浏览(56)
  • elasticsearch(ES)分布式搜索引擎01——(初识ES,索引库操作和文档操作,RestClient操作索引库和文档)

    1.1.1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容 1.1.2.ELK技术栈 elasticsearch结合kibana、Logstash、Beats,也就是elastic stack(ELK)。被广泛应用在日志数据分析、实时监控等领域: 而elasticsearc

    2024年02月07日
    浏览(62)
  • springboot集成Elasticsearch7.16,使用https方式连接并忽略SSL证书

    千万万苦利用科学上网找到了,记录一下

    2024年02月09日
    浏览(48)
  • 18、全文检索--Elasticsearch-- SpringBoot 整合 Spring Data Elasticsearch(异步方式(Reactive)和 传统同步方式 分别操作ES的代码演示)

    启动命令行窗口,执行:elasticsearch 命令即可启动 Elasticsearch 服务器 三种查询方式解释: 方法名查询: 就是全自动查询,只要按照规则来定义查询方法 ,Spring Data Elasticsearch 就会帮我们生成对应的查询语句,并且生成方法体。 @Query 查询 : 就是半自动查询, 按照 S

    2024年03月12日
    浏览(67)
  • SpringBoot集成MybatisPlus

    依赖 SpringBoot的数据表配置: mybatisPlus 打印sql日志: 创建数据表: 实体类 注解 @TableName(),指定数据表名称。 注解 @TableId指定主键。 @TableId(type = IdType.AUTO) : 表示自增id。 @TableId(type = IdType.ID_WORKER) :ID_WORKER生成19位数字,对应类型Long @TableId(type = IdType.ID_WORKER_STR) :ID_WORKE

    2024年02月06日
    浏览(57)
  • Springboot入门之集成MybatisPlus

    MybatisPlus是一个 Mybatis的增强工具,在Mybatis的基础上只做增强不做改变,为简化开发、提高效率而生。  1.添加依赖【pom.xml】 2.配置数据源信息[application.yml] 3.MybatisPlus拦截器配置 配置后MybatisPlus增加功能生效【如分页等】。 4.编写XxxMapper extends BaseMapperXxxDo; 5.编写XxxService e

    2023年04月10日
    浏览(40)
  • SpringBoot集成MyBatisPlus+MySQL(超详细)

    😊 @ 作者: Eric 💖 @ 主页: https://blog.csdn.net/weixin_47316183?type=blog 🎉 @ 主题: SpringBoot集成MyBatisPlus+MySQL(超详细) ⏱️ @ 创作时间: 2023年08月06日 MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 MybatisPlus可以节省大量

    2024年02月09日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包