ElasticSearch-Springboot-Data使用

之前说过ElasticSearch一共支持4种Api,本篇文章主要讲解Springboot数据层集成ElasticSearch的Api简单使用。先看看下面这个Spring集成数据层框架图

可以看到Spring Data系列集成了非常多数据层框架,JDBC,Redis,ElasticSearch,Hadoop,Solr,MongoDB等,非常多啊,感觉spring是要一统天下啊,多的不说了,看看我们这个es怎么做

注意:我这里es的版本是5.6.2,由于es官方更新较快(现在已经7.15),相关api的使用,内部方法也在变,所以别的版本可能会有些变化

1.创建springboot项目,导入相关依赖

首先parent父工程,我这里是2.0.5版本,对应里面的es版本刚好是5.x版本,如果不一样,需改变版本

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.5.RELEASE</version>
</parent>
<dependencies><!--springboot集成elasticsearch包--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency><!--springbootweb包--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--测试包--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><!--lombok包--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--elasticsearch不能存储对象,需要转换成json字符串--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.1.15</version></dependency>
</dependencies>

2.创建好启动类(不做演示),以及yaml配置文件

spring:data:elasticsearch:cluster-name: elasticsearchcluster-nodes: 127.0.0.1:9300

3.创建实体类,做es的文档对象

@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(indexName = "student",type = "infro")
public class Student {@Idprivate Long id;@Field(type = FieldType.Text,analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")private String sname;@Field(type = FieldType.Keyword)private int sage;@Field(type = FieldType.Text,analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")private String intro;
}

@Document(indexName = “student”,type = “infro”)

indexName:指定索引名

type:指定类型名

@Id:代表文档id

@Field(type = FieldType.Text,analyzer = “ik_max_word”,searchAnalyzer = “ik_max_word”)

type:自定该字段的类型(Text和KeyWord都是String类型,Text代表分词,KeyWord代表不分词)

analyzer:指定存储时使用什么分词策略

searchAnalyzer:指定搜索时使用什么分词策略

4.创建索引测试类

@RunWith(SpringRunner.class)
@SpringBootTest(classes = ESApp.class)
public class EsIndexTest {@Autowiredprivate ElasticsearchTemplate elasticsearchTemplate;@Testpublic void testCreateIndex(){// 创建索引elasticsearchTemplate.createIndex(Student.class);// 做文档映射elasticsearchTemplate.putMapping(Student.class);}
}

5.创建文档测试类

@RunWith(SpringRunner.class)
@SpringBootTest(classes = ESApp.class)
public class EsSimpleDocTest {@Autowiredprivate EsRepository esRepository;// 添加文档@Testpublic void testAddDoc(){Student student = new Student(1L, "zhangsan", 18, "法外狂徒张三");esRepository.save(student);}// 修改文档:和添加文档一样,只不过id必须相同@Testpublic void testUpdateDoc(){Student student = new Student(1L, "lisi", 20, "法外狂徒李四");esRepository.save(student);}// 删除文档数据@Testpublic void testDelDoc(){esRepository.deleteById(1L);}// 查询数据@Testpublic void testSearchDoc(){// 获取全部数据Iterable<Student> students = esRepository.findAll();students.forEach(student -> {System.out.println(student);});System.out.println("=============");// 根据id获取Optional<Student> studentOptional = esRepository.findById(1L);Student student = studentOptional.get();System.out.println(student);}// 保存一堆数据@Testpublic void testAddMutilDoc(){ArrayList<Student> students = new ArrayList<>();students.add(new Student(1L,"zhangsan",18,"法外狂徒张三"));students.add(new Student(2L,"lisi",20,"那真是绝了"));students.add(new Student(3L,"王五",28,"法外狂徒张三"));students.add(new Student(4L,"周勇",30,"不会吧"));students.add(new Student(5L,"何总",25,"可恶"));students.add(new Student(6L,"lisi",18,"秀儿"));esRepository.saveAll(students);}
}

6.文档高级搜索

@RunWith(SpringRunner.class)
@SpringBootTest(classes = ESApp.class)
public class EsMutilSearchDocTest {@Autowiredprivate EsRepository esRepository;// 高级查询@Testpublic void testMutilSearch(){// 创建一个查询构造器NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();// 查询条件(组合查询)BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();// 必须满足sname匹配lisi字符boolQueryBuilder.must(QueryBuilders.matchQuery("sname","lisi"));// 过滤条件boolQueryBuilder.filter(QueryBuilders.rangeQuery("sage").gte(18).lte(30));builder.withQuery(boolQueryBuilder);//按照年龄排序builder.withSort(new FieldSortBuilder("sage").order(SortOrder.ASC));// 分页builder.withPageable(PageRequest.of(0,10));// 通过构造器构建查询对象NativeSearchQuery searchQuery = builder.build();// 查询获取到page对象Page<Student> studentPage = esRepository.search(searchQuery);// 总条数System.out.println(studentPage.getTotalElements());// 总分页System.out.println(studentPage.getTotalPages());// 获取到真正需要的对象List<Student> students = studentPage.getContent();// 循环打印students.forEach(student -> {System.out.println(student);});}
}

7.文档高亮搜素

7.1SpringbootData中没有对高亮结果处理,所以要自己写结果处理器,并交给spring管理
@Component
public class HighlightResultMapper implements SearchResultMapper {@Overridepublic <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> aClass, Pageable pageable) {// 记录总条数long totalHits = response.getHits().getTotalHits();// 记录列表(泛型) - 构建Aggregate使用List<T> list = Lists.newArrayList();// 获取搜索结果(真正的的记录)SearchHits hits = response.getHits();for (SearchHit hit : hits) {if(hits.getHits().length <= 0){return null;}// 将原本的JSON对象转换成Map对象Map<String, Object> map = hit.getSourceAsMap();// 获取高亮的字段MapMap<String, HighlightField> highlightFields = hit.getHighlightFields();for (Map.Entry<String, HighlightField> highlightField : highlightFields.entrySet()) {// 获取高亮的KeyString key = highlightField.getKey();// 获取高亮的ValueHighlightField value = highlightField.getValue();// 实际fragments[0]就是高亮的结果,无需遍历拼接Text[] fragments = value.getFragments();StringBuilder sb = new StringBuilder();for (Text text : fragments) {sb.append(text);}// 因为高亮的字段必然存在于Map中,就是key值// 可能有一种情况,就是高亮的字段是嵌套Map,也就是说在Map里面还有Map的这种情况,这里没有考虑map.put(key, sb.toString());}// 把Map转换成对象T item = JSON.parseObject(JSONObject.toJSONString(map),aClass);list.add(item);}// 返回的是带分页的结果return new AggregatedPageImpl<>(list, pageable, totalHits);}}
7.2文档高亮测试
@RunWith(SpringRunner.class)
@SpringBootTest(classes = ESApp.class)
public class EsHighlightMutilSearchTest {@Autowiredprivate ElasticsearchTemplate elasticsearchTemplate;@Autowiredprivate HighlightResultMapper highlightResultMapper;// 测试高亮@Testpublic void testHighlightSearch(){// 构建查询构造器NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder();// 设置查询条件(全部查询)searchQueryBuilder.withQuery(QueryBuilders.matchAllQuery());// 分页、排序那些就不写了,直接写高亮// 构建高亮查询(分别设置高亮字段以及其前缀后缀)HighlightBuilder.Field highlightBuilder = new HighlightBuilder.Field("sname").preTags("<font color='red'>").postTags("</font>");// 将高亮设置进去searchQueryBuilder.withHighlightFields(highlightBuilder);// 构建出具体条件NativeSearchQuery searchQuery = searchQueryBuilder.build();//开始查询(以高亮的方式查询)AggregatedPage<Student> page = elasticsearchTemplate.queryForPage(searchQuery, Student.class, highlightResultMapper);// 打印结果System.out.println(page.getTotalElements());System.out.println(page.getTotalPages());List<Student> students = page.getContent();students.forEach(student -> {System.out.println(student);});}}

8.聚合查询

8.1聚合查询也是一样,springboot没有处理器需要自己创建

其实跟高亮那个处理器一样,只不过在返回值时多加了一个聚合

@Component
public class AggregationResultMapper implements SearchResultMapper {@Overridepublic <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> aClass, Pageable pageable) {// 记录总条数long totalHits = response.getHits().getTotalHits();// 记录列表(泛型) - 构建Aggregate使用List<T> list = Lists.newArrayList();// 获取搜索结果(真正的的记录)SearchHits hits = response.getHits();for (SearchHit hit : hits) {if(hits.getHits().length <= 0){return null;}// 将原本的JSON对象转换成Map对象Map<String, Object> map = hit.getSourceAsMap();// 获取高亮的字段MapMap<String, HighlightField> highlightFields = hit.getHighlightFields();for (Map.Entry<String, HighlightField> highlightField : highlightFields.entrySet()) {// 获取高亮的KeyString key = highlightField.getKey();// 获取高亮的ValueHighlightField value = highlightField.getValue();// 实际fragments[0]就是高亮的结果,无需遍历拼接Text[] fragments = value.getFragments();StringBuilder sb = new StringBuilder();for (Text text : fragments) {sb.append(text);}// 因为高亮的字段必然存在于Map中,就是key值// 可能有一种情况,就是高亮的字段是嵌套Map,也就是说在Map里面还有Map的这种情况,这里没有考虑map.put(key, sb.toString());}// 把Map转换成对象T item = JSON.parseObject(JSONObject.toJSONString(map),aClass);list.add(item);}// 返回的是带分页的结果return new AggregatedPageImpl<>(list, pageable, totalHits,response.getAggregations());}}
8.2聚合查询测试
@RunWith(SpringRunner.class)
@SpringBootTest(classes = ESApp.class)
public class EsAggregationSearchTest {@Autowiredprivate ElasticsearchTemplate elasticsearchTemplate;@Autowiredprivate AggregationResultMapper aggregationResultMapper;// 聚合查询@Testpublic void testAggregationSearch(){NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder();searchQueryBuilder.withQuery(QueryBuilders.matchAllQuery());// 聚合查询TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("paixu").field("sage").order(Terms.Order.count(false));// 添加聚合查询searchQueryBuilder.addAggregation(termsAggregationBuilder);NativeSearchQuery searchQuery = searchQueryBuilder.build();// 开始查询AggregatedPage<Student> page = elasticsearchTemplate.queryForPage(searchQuery, Student.class, aggregationResultMapper);StringTerms terms = (StringTerms) page.getAggregation("paixu");List<StringTerms.Bucket> buckets = terms.getBuckets();//把机构名字聚合,搜集成字符串里集合List<String> sages = buckets.stream().map(bucket -> bucket.getKeyAsString()).collect(Collectors.toList());System.out.println(sages);}
}

ElasticSearch-Springboot-Data使用相关推荐

  1. SpringBoot Data整合ElasticSearch

    SpringBoot Data整合ElasticSearch pom依赖 <!-- spring data和es的start依赖,会引入关联的elasticsearch-rest-high-le ...

  2. 关于用scala 写Elasticsearch +springboot+jpa

    关于用scala 写Elasticsearch +springboot+jpa 最近在项目中用到这个 框架结构,用起来特别方便,分享下 引包 build.sbt "org.springfra ...

  3. ElasticSearch - SpringBoot集成ES

    文章目录 ElasticSearch - SpringBoot集成ES 1.整体设计思路(仿NBA中国官网) 2.项目搭建 3.ES API的基本使用 3.1 新增球员信息 3.2 查看球员信息 3. ...

  4. springboot data.redis.RedisConnectionFactory 集成问题

    springboot 集成springboot data redis出错: org.springframework.beans.factory.NoSuchBeanDefinitionExceptio ...

  5. 【Elasticsearch】Data too large, data for which is larger than the limit of

    1.概述 参考:elasticsearch报Data too large异常处理 在线上ES集群日志中发现了如下异常,elasticsearch版本为7.3.2 [2021-03-16T21:05:1 ...

  6. Elasticsearch:Data streams(三)

    这是一个系列文章的第三篇文章.之前的两篇文章如下: Elasticsearch:Data streams(一) Elasticsearch:Data streams(二) 在今天的文章中,我将详述如何 ...

  7. 【SpringBoot Data JPA】多表关联查询

    SpringBoot Data JPA 多表关联查询 前言 一.数据库架构设计 1.1 数据表结构 2.2 建立数据库表: 二.SpringBoot整合JPA多表查询 2.1 环境配置 2.2 建立数 ...

  8. elasticsearch springboot 实现分词搜索

    实现分词搜索之前必须保证您的springboot 已经连接上了你的elasticsearch 这里展示下我的配置信息和pom文件 application.yml spring: data: elast ...

  9. ElasticSearch+SpringBoot实现汉语、拼音模糊搜索简单demo

    一.效果图 1.1 拼音搜索 1.2 汉字搜索 现在需要实现输入拼音只匹配 第一个汉字,处于第二位和后面的不匹配,如果有大佬知道请赐教. 二.代码实现 2.1.相关环境搭建 1.安装ES(版本:5.0 ...

  10. ElasticSearch,docker 安装ElasticSearch,Springboot 使用 ElasticSearch JavaAPI

    什么是 ElasticSearch ? 数据库查询存在的问题: 性能低:使用模糊查询,左边有通配符,不会走索引,会全表扫描,性能低 关键字模糊查询比较麻烦 ElasticSearch概念 • Elas ...

最新文章

  1. python gpu加速库比matlab快吗_为什么异步库比此I/O绑定操作的线程慢?
  2. 使用yum安装gitlab
  3. 【采用】反欺诈之四大杀器
  4. 数据中心机房供电需求有哪些?供配电系统如何布置??
  5. 3-4HDFS的特点
  6. 搭建linux环境的tomcat服务器
  7. Linux ssh 不需要输入密码的方法
  8. spring5.0学习笔记2
  9. H264--NAL层的处理--3
  10. API Guides Contacts Provider (三)
  11. Unity 与EasyAR结合 新手入门教程
  12. 用路由器打印机显示服务器不存在,打印机连路由器怎么搜索不到
  13. macOS Big Sur 11.7.1 (20G918) 正式版 ISO、PKG、DMG、IPSW 下载
  14. 亚马逊服务器升降配和增/减磁盘
  15. 极化的概念及天线极化方式
  16. 支付系统设计包含:账户,对账,风控...!史上最全的!--转
  17. 游戏经典题目之十字激光炮
  18. 程序框图计算机算法语言应用,第3讲 程序框图与算法语句
  19. 【mysql进阶】MTS主从同步原理及实操指南(七)
  20. 合泰杯——合泰单片机工程之点亮LED

热门文章

  1. CSS核心的几个概念
  2. vsftpd安装、多用户配置
  3. Array.forEach
  4. 用jQuery和css3实现的一个模仿淘宝ued博客左边的菜单切换动画效果
  5. 有关javaScript面向对象和原型笔记
  6. C#核心概念--装箱和拆箱(什么是装箱和拆箱)
  7. 不同内存区域的功能和特点
  8. find找多个单元格的文本_灵活套用LEFT、RIGHT、MID、FIND函数,解决90%的信息提取问题...
  9. 2019年北航OO第二单元(多线程电梯任务)总结
  10. 爬虫-scrapy数据的持久化存储