一、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: 8080spring:elasticsearch:rest:uris: http://127.0.0.1:9200  #多个地址用逗号分隔
#      username:     #用户名
#      password:     #密码connection-timeout: 6000read-timeout: 6000

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

三、ElasticsearchRestTemplate 操作ES

首先新建一个ES的entity 类:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "user", shards = 3, replicas = 1, refreshInterval = "30s")
public class UserEsEntity {@Idprivate 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> {
}


对于查询已经不建议使用ElasticsearchRepository了,下面直接学习ElasticsearchRestTemplate 的Api吧。

1. 判断索引是否存在

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

@Slf4j
@RestController
@RequestMapping("/rest")
public class RestTemplateController {@AutowiredElasticsearchRestTemplate 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();
//        并且 andqueryBuilder.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();
//        并且 andqueryBuilder.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";}


喜欢的小伙伴可以关注我的个人微信公众号,获取更多学习资料!

Elasticsearch 7.X SpringBoot 使用 ElasticsearchRestTemplate 操作 ES相关推荐

  1. SpringBoot高级-检索-SpringBoot整合Jest操作ES

    接下来就用SpringBoot来整合ElasticSearch进行测试,pom文件引入了spring-boot-starter-data-elasticsearch,其实加了data都是用spring ...

  2. 【ElasticSearch】(四)—— RestClient操作ES

    目录 ​编辑 一.RestClient操作索引 环境搭建 1.导入数据 2.导入项目 3.mapping映射分析 4.初始化RestClient 1)创建索引库 1.代码解读 2.完整示例 2)删除索 ...

  3. Elasticsearch的介绍 以及使用python操作es详细步骤

    一. 什么是 Elasticsearch 想查数据就免不了搜索,搜索就离不开搜索引擎,百度.谷歌都是一个非常庞大复杂的搜索引擎,他们几乎索引了互联网上开放的所有网页和数据.然而对于我们自己的业务数据来 ...

  4. Elasticsearch(六) java代码操作Es进行高级查询match、match_all

    Es在查询时其主要步骤如下: 1,构建SearchRequest请求对象,指定索引库, 2,构建SearchSourceBuilder查询对象 3,构建QueryBuilder对象指定查询方式和查询条 ...

  5. springboot整合es_[ElasticSearch从入门到场景实战]spring boot集成SpringData操作es

    人生起起伏伏,有风光无限日,也有落魄失魂时,人在低谷时,唯有"熬过去,才会赢" 前言 Elasticsearch的Spring Data是Spring Data项目的一部分,Spr ...

  6. springboot整合bboss操作elasticsearch

    elaticsearch有很多的java客户端,像transportclient,jestclient,springdata.但是还有一种bboss可以让我们像操作mybatis一样的来操作elast ...

  7. springboot操作ES之ElasticSearch_EasyEs

    springboot操作ES之ElasticSearch_EasyEs 前置环境 es:7.x springboot:2.6.0 easyes:1.0.2 1.导入依赖 <dependency& ...

  8. SpringBoot操作ES进行各种高级查询(值得收藏)

    来源:cnblogs.com/keatsCoder/p/11341835.html SpringBoot整合ES 创建SpringBoot项目,导入 ES 6.2.1 的 RestClient 依赖和 ...

  9. SpringBoot 操作 ES 进行各种高级查询

    点击上方"Java基基",选择"设为星标" 做积极的人,而不是积极废人! 每天 14:00 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java ...

最新文章

  1. Apple Watch开发快速入门教程
  2. 深度学习专家Karpathy加入特斯拉,或将负责自动驾驶视觉研究
  3. VSCode打造成为开发神器-插件篇
  4. win7映射linux硬盘_win7下安装Linux实现双系统全攻略
  5. KTH 皇家理工学院 计算机视觉和机器学习博士生 招生
  6. #华为云·寻找黑马程序员#【代码重构之路】如何优雅的关闭外部资源
  7. Codeforces Beta Round #7 C. Line 扩展欧几里德
  8. Django 09-2 模型层 字段
  9. 剑破冰山—Oracle开发艺术 目录
  10. 交通流理论3——交通流三大参数
  11. oppoJava面试!一招彻底帮你搞定HashMap源码,极其重要
  12. 如何找回删除的文件?数据恢复,看这几个方法
  13. 博客园app for xamarin android一款简洁阅读的博客园android客户端
  14. MySQL命令行中文显示乱码怎么办
  15. Matlab_R2016a 中文破解版 安装教程
  16. Ruby读取Excel文件的两种方法
  17. D7100 调节白平衡
  18. 试试多线程(java)
  19. 科大讯飞语音离线命令识别
  20. 工程师文化:正版软件应该公司买吗

热门文章

  1. UiPath机器人流程
  2. java品牌_利用java编写物品的品牌、尺寸、价格、库存(新手)
  3. 乐高大颗粒作品18:闸机的原理
  4. 基于微信小程序的农产品电商平台精准营销模式创新研究
  5. 一张看不清的黑洞照片,却藏着大量的天文信息!
  6. 新型肺炎感染人数数据图表化
  7. RK3399平台开发系列讲解(DMA篇)深刻理解DMA
  8. NACE配置SAP output功能
  9. 30 天精通 RxJS (03): Functional Programming 通用函数
  10. Adobe Acrobat Pro DC打开PDF图标异常