Elasticsearch 7.X SpringBoot 使用 ElasticsearchRestTemplate 操作 ES

这篇具有很好参考价值的文章主要介绍了Elasticsearch 7.X SpringBoot 使用 ElasticsearchRestTemplate 操作 ES。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、ElasticsearchRestTemplate

前面学习了es rest接口对es进行操作的方式,并且还学习了es的分片及扩容,有讲解了几种常见的分词器,喜欢的小伙伴可以看下本专栏的其他文章,本篇主要将 在 SpringBoot 中使用ElasticsearchRestTemplate 对ES进行操作。

对于SpringBoot对ES的操作早在以前我就写过一篇文章,但那时基于ES 6.X 的,在新版本的ES中都已经不建议使用了。

注意: 在网上还有些教程是使用TransportClient进行操作的,在 Elasticsearch 7.0 中不建议使用TransportClient,并且在8.0中会完全删除TransportClient。因此,官方更建议我们用Java High Level REST Client,它执行HTTP请求,而不是序列化的Java请求。

我们的使用的 ElasticsearchRestTemplate 就是基于RestHighLevelClient的再一层封装,下面我们一起开始吧。

二、SpringBoot 整合 ES 客户端环境

首先新建一个SpringBoot项目,再pom中引入es的依赖:

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

在application.yml配制文件中,配制es的连接:

server:
  port: 8080

spring:
  elasticsearch:
    rest:
      uris: http://127.0.0.1:9200  
#      username:     #用户名
#      password:     #密码
      connection-timeout: 6000
      read-timeout: 6000

集群方式

server:
  port: 8080

spring:
  elasticsearch:
    rest:
      uris: 
        - http://192.168.0.1:9200
        - http://192.168.0.2:9200
        - http://192.168.0.3:9200
#      username:     #用户名
#      password:     #密码
      connection-timeout: 6000
      read-timeout: 6000

到此环境就已经搭建好了,下面开始对es进行操作吧。

三、ElasticsearchRestTemplate 操作ES

首先新建一个ES的entity 类:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "user", shards = 3, replicas = 1, refreshInterval = "30s")
public class UserEsEntity {
    @Id
    private String id;
    @Field(type = FieldType.Text, searchAnalyzer = "ik_max_word", analyzer = "ik_smart")
    private String name;
    @Field(type = FieldType.Keyword)
    private String sex;
    @Field(type = FieldType.Integer)
    private Integer age;
    @Field(type = FieldType.Keyword, index = false)
    private String grade;
}

定义索引名称为user,分片为3,每个分片的副本是1,刷新时间是30s。

下面可以新建一个ElasticsearchRepository,其实可以直接用ElasticsearchRestTemplate 就可以进行es的操作了,而且Repository中很多方法都被标了过时,这里大家也可以看下:

@Repository
public interface UserEsDao extends ElasticsearchRepository<UserEsEntity, Long> {
}

Elasticsearch 7.X SpringBoot 使用 ElasticsearchRestTemplate 操作 ES
对于查询已经不建议使用ElasticsearchRepository了,下面直接学习ElasticsearchRestTemplate 的Api吧。

1. 判断索引是否存在

其实在前面写好Entity,启动项目如果索引不存在就会自动创建的,这里也可以通过Api的方式进行验证:

@Slf4j
@RestController
@RequestMapping("/rest")
public class RestTemplateController {
    @Autowired
    ElasticsearchRestTemplate elasticsearchRestTemplate;

    @GetMapping("/indexExists")
    public String indexExists() {
        boolean r1 = elasticsearchRestTemplate.indexExists(UserEsEntity.class);
        boolean r2 = elasticsearchRestTemplate.indexExists("user2");
//		创建索引
//      elasticsearchRestTemplate.createIndex()
        log.info("r1: {} , r2: {}", r1, r2);
        return "success";
    }
}
2. 新增文档数据
  @GetMapping("/save")
    public String save() {
        UserEsEntity esEntity = new UserEsEntity(null, "张三", "男", 18, "1");

//        不要拿到自增的返回值
//        UserEsEntity save = elasticsearchRestTemplate.save(esEntity);
//        log.info(save.toString());

//        拿到自增的返回值
        IndexQuery indexQuery = new IndexQueryBuilder()
//                .withId(esEntity.getId())
                .withObject(esEntity)
                .build();
        String id = elasticsearchRestTemplate.index(indexQuery, IndexCoordinates.of("user"));
        log.info("添加的id:{} ", id);

//        批量添加
//        List<UserEsEntity> list = new ArrayList<>();
//        list.add(esEntity);
//        list.add(esEntity);
//        elasticsearchRestTemplate.save(list);
        return "success";
    }
3. 更新文档数据

其中根据条件批量修改需要使用RestHighLevelClient,直接注入即可:

@Autowired
RestHighLevelClient restHighLevelClient;
    @GetMapping("/update")
    public String update() throws IOException {
//        覆盖修改
//        UserEsEntity esEntity = new UserEsEntity("W9MVD34BVYNyxUnr8cdE", "lisi", "男", 20, "1");
//        elasticsearchRestTemplate.save(esEntity);
//        UpdateQuery query = UpdateQuery.builder("W9MVD34BVYNyxUnr8cdE");

//        根据ID 修改某个字段
//        Document document = Document.create();
//        document.putIfAbsent("name", "wangwu2"); //更新后的内容
//        UpdateQuery updateQuery = UpdateQuery.builder("W9MVD34BVYNyxUnr8cdE")
//                .withDocument(document)
//                .withRetryOnConflict(5) //冲突重试
//                .withDocAsUpsert(true) //不加默认false。true表示更新时不存在就插入
//                .build();
//        UpdateResponse response = elasticsearchRestTemplate.update(updateQuery, IndexCoordinates.of("user"));
//        log.info(response.getResult().toString()); //UPDATED 表示更新成功


//       根据条件批量更新 ,使用 RestHighLevelClient
//        https://blog.csdn.net/weixin_34318272/article/details/88690004
//        参数为索引名,可以不指定,可以一个,可以多个
        UpdateByQueryRequest request = new UpdateByQueryRequest("user");
//        版本冲突
        request.setConflicts("proceed");
//        设置查询条件
        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
//        并且 and
        queryBuilder.must(QueryBuilders.termQuery("name", "lisi"));
        queryBuilder.must(QueryBuilders.termQuery("sex", "男"));
        request.setQuery(queryBuilder);
//        批次大小
        request.setBatchSize(1000);
//        并行
        request.setSlices(2);
//        使用滚动参数来控制“搜索上下文”存活的时间
        request.setScroll(TimeValue.timeValueMinutes(10));
//        刷新索引
        request.setRefresh(true);
//        更新的内容
        request.setScript(new Script("ctx._source['name']='wangwu'"));
        BulkByScrollResponse response = restHighLevelClient.updateByQuery(request, RequestOptions.DEFAULT);
        log.info(response.getStatus().getUpdated() + ""); // 返回1 表示成功
        return "success";
    }
4. 删除文档数据
    @GetMapping("/delete")
    public String delete() {
//        根据id删除
//        String r = elasticsearchRestTemplate.delete("XNMVD34BVYNyxUnr8cdE", IndexCoordinates.of("user"));
//        log.info("r : {} ", r);

//        根据条件删除
        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
//        并且 and
        queryBuilder.must(QueryBuilders.termQuery("name", "zhangsan"));
        queryBuilder.must(QueryBuilders.termQuery("sex", "男"));
        Query query = new NativeSearchQuery(queryBuilder);
        elasticsearchRestTemplate.delete(query, UserEsEntity.class, IndexCoordinates.of("user"));

        return "success";
    }
5. 查询文档数据
    @GetMapping("/search")
    public String search() {
//        查询全部数据
//        QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();

//        精确查询 =
//        QueryBuilder queryBuilder = QueryBuilders.termQuery("name", "lisi");

//        精确查询 多个 in
//        QueryBuilder queryBuilder = QueryBuilders.termsQuery("name", "张三", "lisi");

//        match匹配,会把查询条件进行分词,然后进行查询,多个词条之间是 or 的关系,可以指定分词
//        QueryBuilder queryBuilder = QueryBuilders.matchQuery("name", "张三");
//        QueryBuilder queryBuilder = QueryBuilders.matchQuery("name", "张三").analyzer("ik_max_word");

//        match匹配 查询多个字段
//        QueryBuilder queryBuilder = QueryBuilders.multiMatchQuery("男", "name", "sex");

//        fuzzy 模糊查询,返回包含与搜索字词相似的字词的文档。
//        QueryBuilder  queryBuilder = QueryBuilders.fuzzyQuery("name","lisx");

//        prefix 前缀检索
//        QueryBuilder  queryBuilder = QueryBuilders.prefixQuery("name","张");

//        wildcard 通配符检索
//        QueryBuilder  queryBuilder = QueryBuilders.wildcardQuery("name","张*");

//        regexp 正则查询
        QueryBuilder queryBuilder = QueryBuilders.regexpQuery("name", "(张三)|(lisi)");
        
//        boost 评分权重,令满足某个条件的文档的得分更高,从而使得其排名更靠前。
        queryBuilder.boost(2);
//        多条件构建
//        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
//        并且 and
//        queryBuilder.must(QueryBuilders.termQuery("name", "张三"));
//        queryBuilder.must(QueryBuilders.termQuery("sex", "女"));

//        或者 or
//        queryBuilder.should(QueryBuilders.termQuery("name", "张三"));
//        queryBuilder.should(QueryBuilders.termQuery("name", "lisi"));

//        不等于,去除
//        queryBuilder.mustNot(QueryBuilders.termQuery("name", "lisi"));

//        过滤数据
//        queryBuilder.filter(QueryBuilders.matchQuery("name", "张三"));

//        范围查询
        /*
            gt 大于 >
            gte 大于等于 >=
            lt 小于 <
            lte 小于等于 <=
        */
//        queryBuilder.filter(new RangeQueryBuilder("age").gt(10).lte(50));

//        构建分页,page 从0开始
        Pageable pageable = PageRequest.of(0, 3);
        
        Query query = new NativeSearchQueryBuilder()
                .withQuery(queryBuilder)
                .withPageable(pageable)
                //排序
                .withSort(SortBuilders.fieldSort("_score").order(SortOrder.DESC))
                //投影
                .withFields("name")
                .build();
        SearchHits<UserEsEntity> search = elasticsearchRestTemplate.search(query, UserEsEntity.class);
        log.info("total: {}", search.getTotalHits());
        Stream<SearchHit<UserEsEntity>> searchHitStream = search.get();
        List<UserEsEntity> list = searchHitStream.map(SearchHit::getContent).collect(Collectors.toList());
        log.info("结果数量:{}", list.size());
        list.forEach(entity -> {
            log.info(entity.toString());
        });
        return "success";
    }

设置查询返回的条数:文章来源地址https://www.toymoban.com/news/detail-407044.html

QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
NativeSearchQuery query = new NativeSearchQueryBuilder()
        .withQuery(queryBuilder )
        .build();
// 允许返回条数设置  默认返回10000条
// 允许返回查询结果的total, search.getTotalHits()
searchQuery.setTrackTotalHits(true);
// 允许返回结果list的大小 
searchQuery.setMaxResults(1000000);

到了这里,关于Elasticsearch 7.X SpringBoot 使用 ElasticsearchRestTemplate 操作 ES的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Springboot 整合 Elasticsearch(五):使用RestHighLevelClient操作ES ②

    📁 前情提要: Springboot 整合 Elasticsearch(三):使用RestHighLevelClient操作ES ① 目录  一、Springboot 整合 Elasticsearch 1、RestHighLevelClient API介绍 1.1、全查询 分页 排序 1.2、单条件查询 1.2.1、termQuery 1.2.2、matchQuery 1.2.3、短语检索 1.3、组合查询 1.4、范围查询 1.5、模糊查询 1.6、分组

    2024年04月11日
    浏览(40)
  • SpringBoot之ElasticsearchRestTemplate常用示例

    主要引用 elasticsearch使用相关依赖 注意ES 服务端版本(7.4.0)要与客户端版本相容 注意 hutool的工具类 实体转map 版本 注解:@Document用来声明Java对象与ElasticSearch索引的关系              indexName 索引名称(是字母的话必须是小写字母)              type 索引类型      

    2023年04月09日
    浏览(240)
  • No qualifying bean of type ‘org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate‘ a

    No qualifying bean of type ‘org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate’ available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 提示找不到 ElasticsearchRestTemplate 写一个配置类注入

    2024年02月17日
    浏览(46)
  • 【Elasticsearch学习笔记五】es常用的JAVA API、es整合SpringBoot项目中使用、利用JAVA代码操作es、RestHighLevelClient客户端对象

    目录 一、Maven项目集成Easticsearch 1)客户端对象 2)索引操作 3)文档操作 4)高级查询 二、springboot项目集成Spring Data操作Elasticsearch 1)pom文件 2)yaml 3)数据实体类 4)配置类 5)Dao数据访问对象 6)索引操作 7)文档操作 8)文档搜索 三、springboot项目集成bboss操作elasticsearch

    2023年04月09日
    浏览(48)
  • ElasticsearchRestTemplate 基本使用

    随着数据量的增加和数据结构的复杂化,传统的关系型数据库已经不能满足用户的需求,而搜索引擎则成为了一种更加高效、可扩展的数据检索方案。而 Elasticsearch 则是一个流行的搜索引擎,在 Java 生态系统中,ElasticsearchRestTemplate 是一个使用起来非常方便的 Elasticsearch 客户

    2024年02月09日
    浏览(30)
  • ElasticsearchRestTemplate 和ElasticsearchRepository 的使用

    目录 一、使用ElasticsearchRestTemplate类  1.引用Maven类库 2. 配置文件application.yml 3.创建实体类(用于JSON文档对象的转换) 二、使用ElasticsearchRepository 类 1.引用Maven类库 2. 配置文件application.yml 3. ElasticsearchRepository接口的源码  4.CrudRepository  源码 5. 查询查找策略 5.1存储库方法可

    2024年02月03日
    浏览(35)
  • ElasticSearchRepository和ElasticsearchRestTemplate的使用

    上一章:《SpringBoot整合ElasticSearch实现模糊查询,批量CRUD,排序,分页,高亮》 在上一章节,我们学习到了es通过RestHighLevelClient实现最基本的增删改查的语法,在本章我们继续深入实践一下es的相关操作,在SpringBoot的相关依赖中,es已经帮我们将基本的操作都进行了封装,我

    2024年02月03日
    浏览(30)
  • Springboot操作Elasticsearch——聚合分组与排序

    这两天项目中需要从es中查询数据,根据某个字段进行分组,求其最大、最小、平均值,并按最大值进行排序。 springboot的版本号:2.0.6.RELEASE Elasticsearch的版本号:5.6.3 主要代码记录下: BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()                 .filter(QueryBuilders.termsQu

    2024年02月16日
    浏览(44)
  • 【SpringBoot】整合Elasticsearch 操作索引及文档

    官网操作文档:Elasticsearch Clients | Elastic                踩坑太多了。。。这里表明一下Spring Boot2.4以上版本可能会出现问题,所以我降到了2.2.1.RELEASE。对于现在2023年6月而言,Es版本已经到了8.8,而SpringBoot版本已经到了3.x版本。如果是高版本的Boot在配置类的时候会发现

    2024年02月09日
    浏览(50)
  • Elasticsearch 7.6 - Springboot应用基础操作篇

    上文已经教了大家最基本的操作了,那我们在java代码里面要如何实现呢?本文的目的就是教大家在springboot框架下实现上文的API操作,也就是CURD! 首先我们要知道ES的API都是 HTTP请求!!!! ,所以什么语言都可以操作,就是发送请求和处理返回而已嘛,只是说现在这种封装

    2024年02月10日
    浏览(27)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包