SpringBoot3 整合 ElasticSearch7 示例

这篇具有很好参考价值的文章主要介绍了SpringBoot3 整合 ElasticSearch7 示例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目需求

做仿牛客项目需要使用 es 做搜索,但是老师示例的是 SpringBoot2 + es6 去做的,然而我用的是 Spring3 + es7.17.10,于是踩了很多的坑。

在 es7 中,配置文件和查询所需的实现类都做了很大的改动,我以能成功运行的代码为例,大概说一下怎么配置和使用。

yml 配置文件

# ElasticsearchProperties
#spring.data.elasticsearch.cluster-name=my-cluster
#spring.data.elasticsearch.cluster-nodes=centos:9300
spring.elasticSearch.uris=centos:9200
spring.elasticsearch.connection-timeout=20000ms
spring.data.elasticsearch.repositories.enabled=true

首先 yml 配置文件发生了变化,不能使用原来的集群名称和节点的配置了。

搜索的变化

在需要使用搜索的功能时,原来的 ElasticsearchTemplate 被弃用了,也不能使用 SearchQuery 类去做查询了。在 es7.17.10 中,要使用 SearchRequest 和 SearchResponse 搭配 RestHighLevelClient 来完成查询。

写配置类将 RestHighLevelClient 注入容器管理

首先应该写一个配置类,将 RestHighLevelClient 创建出来,交给容器进行管理。

@Configuration
public class EsConfig {
    @Value("${spring.elasticsearch.uris}")
    private String esUrl;

    //localhost:9200 写在配置文件中,直接用 <- spring.elasticsearch.uris
    @Bean
    RestHighLevelClient client() {
        ClientConfiguration clientConfiguration = ClientConfiguration.builder()
                .connectedTo(esUrl)//elasticsearch地址
                .build();

        return RestClients.create(clientConfiguration).rest();
    }
}

不带高亮的搜索

在需要搜索的地方注入 RestHighLevelClient ,需要使用 SearchRequest 、 SearchResponse 和 searchSourceBuilder 来搭配 RestHighLevelClient 完成查询。

SearchRequest 根据索引名构建请求,searchSourceBuilder 负责构建搜索条件。
搜索条件构建完成后,用 SearchRequest 请求来接收。最后接收了搜索条件的 SearchRequest 通过 restHighLevelClient 的 client 方法完成了搜索,返回一个 SearchResponse 对象。

代码如下:

@Test
public void noHighlightQuery() throws IOException {
    SearchRequest searchRequest = new SearchRequest("discusspost");//discusspost是索引名,就是表名

    //构建搜索条件
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder()
            //在discusspost索引的title和content字段中都查询“互联网寒冬”
            .query(QueryBuilders.multiMatchQuery("互联网寒冬", "title", "content"))
            // matchQuery是模糊查询,会对key进行分词:searchSourceBuilder.query(QueryBuilders.matchQuery(key,value));
            // termQuery是精准查询:searchSourceBuilder.query(QueryBuilders.termQuery(key,value));
            .sort(SortBuilders.fieldSort("type").order(SortOrder.DESC))
            .sort(SortBuilders.fieldSort("score").order(SortOrder.DESC))
            .sort(SortBuilders.fieldSort("createTime").order(SortOrder.DESC))
            //一个可选项,用于控制允许搜索的时间:searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
            .from(0)// 指定从哪条开始查询
            .size(10);// 需要查出的总记录条数

    searchRequest.source(searchSourceBuilder);
    SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

    System.out.println(JSONObject.toJSON(searchResponse));

    List<DiscussPost> list = new LinkedList<>();
    for (SearchHit hit : searchResponse.getHits().getHits()) {
        DiscussPost discussPost = JSONObject.parseObject(hit.getSourceAsString(), DiscussPost.class);
        System.out.println(discussPost);
        list.add(discussPost);
    }
    System.out.println(list.size());
    for (DiscussPost post : list) {
        System.out.println(post);
    }
}

那么又有新的问题了,搜索出来的 searchResponse 是个啥玩意呢,我们通过 Json 格式字符串来看一下:
springboot 整合es7,Spring,ElasticSearch,java,elasticsearch,开发语言
我们所需要搜索的实体在 hits 中的 hits 数组中,我们看看数组里是什么样子的:
springboot 整合es7,Spring,ElasticSearch,java,elasticsearch,开发语言
我们发现, hits 数组中,每个数组也有非常多的信息,我们需要的实体对象就存在数组中的 sourceAsMapsourceAsString 中,一个是 map 形式,一个是 Json 字符串的形式。这样就明白我们为什么这么写代码了。

当然,第一个 hits 中还有其他很多数据:
springboot 整合es7,Spring,ElasticSearch,java,elasticsearch,开发语言
其中常用的还有 totalHits 的 value ,代表命中的数据量,一般用来判断是否命中数据。

高亮搜索

当然如果需要高亮搜索,则可以通过构建 HighlightBuilder 来实现,代码如下:

@Test
public void highlightQuery() throws Exception{
    SearchRequest searchRequest = new SearchRequest("discusspost");//discusspost是索引名,就是表名
    Map<String,Object> res = new HashMap<>();

    //高亮
    HighlightBuilder highlightBuilder = new HighlightBuilder();
    highlightBuilder.field("title");
    highlightBuilder.field("content");
    highlightBuilder.requireFieldMatch(false);
    highlightBuilder.preTags("<span style='color:red'>");
    highlightBuilder.postTags("</span>");

    //构建搜索条件
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder()
        .query(QueryBuilders.multiMatchQuery("互联网寒冬", "title", "content"))
        .sort(SortBuilders.fieldSort("type").order(SortOrder.DESC))
        .sort(SortBuilders.fieldSort("score").order(SortOrder.DESC))
        .sort(SortBuilders.fieldSort("createTime").order(SortOrder.DESC))
        .from(0)// 指定从哪条开始查询
        .size(10)// 需要查出的总记录条数
        .highlighter(highlightBuilder);//高亮
    searchRequest.source(searchSourceBuilder);
    SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
    List<DiscussPost> list = new ArrayList<>();
    long total = searchResponse.getHits().getTotalHits().value;
    for (SearchHit hit : searchResponse.getHits().getHits()) {
        DiscussPost discussPost = JSONObject.parseObject(hit.getSourceAsString(), DiscussPost.class);

        // 处理高亮显示的结果
        HighlightField titleField = hit.getHighlightFields().get("title");
        if (titleField != null) {
            discussPost.setTitle(titleField.getFragments()[0].toString());
        }
        HighlightField contentField = hit.getHighlightFields().get("content");
        if (contentField != null) {
            discussPost.setContent(contentField.getFragments()[0].toString());
        }
        //            System.out.println(discussPost);
        list.add(discussPost);
    }
    res.put("list",list);
    res.put("total",total);
    if(res.get("list")!= null){
        for (DiscussPost post : list = (List<DiscussPost>) res.get("list")) {
            System.out.println(post);
        }
        System.out.println(res.get("total"));
    }
}

其中处理高亮显示结果的逻辑如下:
springboot 整合es7,Spring,ElasticSearch,java,elasticsearch,开发语言
至于为什么 titleField.getFragments()[0].toString() 直接就是 Title 高亮后的结果,我也没搞明白…
如果有知道的大佬,欢迎留言,不尽感激。文章来源地址https://www.toymoban.com/news/detail-732809.html

到了这里,关于SpringBoot3 整合 ElasticSearch7 示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • SpringBoot3整合MyBatisPlus

    随着 SpringBoot3 的发布, mybatisplus 也在不断更新以适配 spirngboot3 。目前仍然处于维护升级阶段,最初 2023.08 时,官方宣布对 SpringBoot3 的原生支持,详情看这里。 但是对于较新版本的 SpringBoot3 ,仍然有很多 bug ,甚至无法启动,摸爬滚打又游历社区后,实践后得到一套成功的

    2024年01月24日
    浏览(36)
  • SpringBoot3整合MinIO

    配套视频:SpringBoot3整合MinIO MinIO项目应用可参考视频 【SpringBoot3+Vue3+Uniapp小程序项目实战】 MinIO 是一个基于 Apache License v2.0 开源协议的对象存储服务。它兼容亚马逊 S3 云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器

    2024年02月21日
    浏览(42)
  • [Java Framework] [ELK] Spring 整合ES (ElasticSearch7.15.x +)

    ElasticSearch7.15.x 版本后,废弃了高级Rest客户端的功能 2.1 配置文件 2.2 配置类 3.1 索引的相关操作 3.2 实体映射相关操作 3.2.1 创建实体类 3.2.2 Doc实体操作API 3.3 聚合相关操作 3.3.1 创建实体类 3.3.2 创建操作类 [1] Elasticsearch Clients [2] Elasticsearch Clients - Aggregations

    2023年04月08日
    浏览(35)
  • SpringBoot3 整合Prometheus + Grafana

    通过Prometheus + Grafana对线上应用进行观测、监控、预警… 健康状况【组件状态、存活状态】Health 运行指标【cpu、内存、垃圾回收、吞吐量、响应成功率…】Metrics … 1. 基本使用 1. 场景引入 2. 暴露指标 3. 访问数据 访问 http://localhost:8080/actuator;展示出所有可以用的监控端点

    2024年02月14日
    浏览(31)
  • Springboot3 整合 Mybatis3

    mybatis 的必要依赖 注意:使用 springboot3 的话要使用 mybatis3 的版本以及 java17及以上的版本 注意: 如果接口上面有 注解 @Mapper 的话,就可以不用在使用扫描包注解 @MapperScan 了(当然两个可以同时存在) 注意: 最好要加上 @Mapper注解,防止忘记开启扫描 注意:头文件这里的网

    2024年01月25日
    浏览(42)
  • Java --- springboot3整合SSM

    目录 一、整合SSM场景 二、自动配置原理   引入pom依赖 数据库表: 配置数据源 配置mybatis相关配置 实体类: mapper接口: mapper接口映射文件: service实现类: controller层: 在springboot启动类添加注解: jdbc场景的自动配置 :   1、 mybatis-spring-boot-starter 导入 spring-boot-starter-jd

    2024年02月08日
    浏览(53)
  • SpringBoot整合Mybatis-Plus(SpringBoot3)

    依赖pom.xml: pom.xml resource包下的Application.yml: Aollication.yml pojo包下的实体类User: User mapper包下的接口UserMapper: UserMapper 主启动类DemoPlusApplication DemoPlusApplication 测试类DemoApplicationTest: DemoApplicationTest 实现结果 检测数据库连接: C(Create): D(Delete): U(Update) R(Read)

    2024年03月20日
    浏览(45)
  • 5、Elasticsearch7.6.1 filebeat介绍及收集kafka日志到es示例

    1、介绍lucene的功能以及建立索引、搜索单词、搜索词语和搜索句子四个示例实现 2、Elasticsearch7.6.1基本介绍、2种部署方式及验证、head插件安装、分词器安装及验证 3、Elasticsearch7.6.1信息搜索示例(索引操作、数据操作-添加、删除、导入等、数据搜索及分页) 4、Elasticsearch7

    2024年02月16日
    浏览(39)
  • springboot3.2 整合 mybatis-plus

    springboot3.2 正式发布了 迫不及待地的感受了一下 结果在整个mybatis-plus 的时候遇到了如下报错 主要是由于 mybatis-plus 中 mybatis 的整合包版本不够导致的 排除 mybatis-plus 中自带的 mybatis 整合包,单独引入即可 修改依赖后正常

    2024年02月04日
    浏览(39)
  • springboot集成elasticsearch7.17.3

    环境: jdk1.8 springboot: 2.7.0 spring elastisearch官方文档 1、引入es依赖 2、配置文件application.yaml 1、定义实体类 Book 2、注解: @Document 作用:标识要持久化到Elasticsearch的域对象, 如定义索引名 @Document(indexName=\\\"books\\\") @Id 作用:定义标识符 - 文档id @Id private Long id; @Field 作用:对持久化

    2024年01月25日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包