0


SpringBoot加ES整合的一些基本方法

1、导入Elasticsearch依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
  4. </dependency>

注意这个是parent为低版本的情况下

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.1.18.RELEASE</version>
  5. </parent>

2、进行yml配置 低版本配置

  1. spring:
  2. data:
  3. elasticsearch:
  4. cluster-name: elasticsearch
  5. cluster-nodes: 192.168.71.120:9300

3、实体类

  1. @Data
  2. @NoArgsConstructor
  3. @AllArgsConstructor
  4. //indexName设置索引名称 type定义类型 shards分片数量 replicas副本 每个分片的复制
  5. @Document(indexName = "idx-emp",type = "emp",shards = 5,replicas = 1)
  6. public class Emp implements Serializable {
  7. @Id
  8. private Integer id;
  9. //type设置数据映射类型 analyzer定义分词片
  10. @Field(type = FieldType.Text,analyzer = "ik_max_word")
  11. private String name;
  12. @Field(type = FieldType.Text,analyzer = "ik_max_word")
  13. private String address;
  14. //keyword另类text类型,不进行分词和索引,可以进行过滤、排序、聚合操作
  15. @Field(type = FieldType.Keyword)
  16. private String sex;
  17. @Field(type = FieldType.Double)
  18. private Double sal;
  19. @Field(type = FieldType.Date)
  20. private Date birthday;
  21. }

4、启动类

  1. @SpringBootApplication
  2. public class EsDemoApplication {
  3. public static void main(String[] args) {
  4. SpringApplication.run(EsDemoApplication.class);
  5. }
  6. }

5、测试类 增删改查的基本用法

先看看Dao持久层

  1. public interface EsDao extends ElasticsearchRepository<Emp,Integer> {
  2. //在持久层内 可以进行自定义sql执行方法
  3. //比如findByNameLike(),可以根据name进行模糊查询,该方法不需要去实现,可直接调用,实例看下面
  4. public List<Emp> findByNameLike(String name);
  5. public List<Emp> findByNameLikeAndSex(String name,String Sex);
  6. }

测试类

  1. @SpringBootTest
  2. @RunWith(SpringRunner.class)
  3. public class EsTest {
  4. @Autowired //持久层对象
  5. private EsDao esDao;
  6. @Autowired //ES模板对象
  7. private ElasticsearchTemplate template;
  8. @After
  9. public void finish(){
  10. System.out.println("已完成。。。。");
  11. }
  12. @Test
  13. public void test(){
  14. //创建索引,会根据 Emp 类的@Document注解信息来创建
  15. template.createIndex(Emp.class);
  16. //映射配置,会根据 Emp 类中的id、Field等字段来自动完成映射
  17. template.putMapping(Emp.class);
  18. }
  19. @Test//插入单个对象
  20. public void test2(){
  21. Emp emp = new Emp(1000, "xxx", "xx", "x", 8000.0, new Date());
  22. esDao.save(emp);
  23. }
  24. @Test//批量插入
  25. public void test3(){
  26. List<Emp> list = new ArrayList<>();
  27. list.add(new Emp(1001, "xxxx", "xxx", "x", 7000.0, new Date()));
  28. list.add(new Emp(1002, "xxxx", "xxx", "x", 6000.0, new Date()));
  29. list.add(new Emp(1003, "xxxx", "xxx", "x", 5000.0, new Date()));
  30. esDao.saveAll(list);//saveAll可以插入用集合批量插入
  31. }
  32. @Test //排序查询
  33. public void test4(){
  34. //查询所有
  35. //Iterable<Emp> list = esDao.findAll();
  36. //进行排序查询
  37. Iterable<Emp> list = esDao.findAll(Sort.by(Sort.Direction.DESC,"sal"));
  38. list.forEach(System.out::println);
  39. }
  40. @Test //自定义sql语句方法
  41. public void test5(){
  42. //findByNameLike() Dao层自定义方法 根据name进行模糊查询
  43. //List<Emp> list = esDao.findByNameLike("x");
  44. //根据name,sex,进行name模糊查询和指定sex查询
  45. List<Emp> list1 = esDao.findByNameLikeAndSex("x","x");
  46. list1.forEach(System.out::println);
  47. }
  48. @Test//ES分词查询
  49. public void test7(){
  50. //词条条件 查询条件
  51. MatchQueryBuilder builder = QueryBuilders.matchQuery("address", "中国广东");
  52. //进行查询
  53. Iterable<Emp> list = esDao.search(builder);
  54. list.forEach(System.out::println);
  55. }
  56. @Test//综合分页查询
  57. public void test8(){
  58. //构建查询条件对象 可以理解为存放查询条件的一个容器
  59. NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
  60. //设置查询条件 设置条件根据address字段将 中国xx 进行分词查询
  61. queryBuilder.withQuery(QueryBuilders.matchQuery("address","中国xx"));
  62. //设置分页条件
  63. int pageNo = 0;
  64. int pageSize = 3;
  65. //PageRequest.of()可以在这个方法内放入需要分页的条件
  66. queryBuilder.withPageable(PageRequest.of(pageNo,pageSize));
  67. //排序
  68. queryBuilder.withSort(SortBuilders.fieldSort("sal").order(SortOrder.DESC));
  69. //按照条件进行查询 返回 page 对象实现分页
  70. Page<Emp> page = esDao.search(queryBuilder.build());
  71. //输出查询的数量
  72. System.out.println(page.getTotalElements());
  73. //输出查询的数据详情
  74. page.getContent().forEach(System.out::println);
  75. }
  76. @Test
  77. public void test9(){
  78. //查询构建器
  79. NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
  80. //不要明细
  81. queryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{""}, null));
  82. //添加聚合 进行分组
  83. queryBuilder.addAggregation(AggregationBuilders.terms("sexGroup").field("sex")
  84. .subAggregation(AggregationBuilders.max("maxSal").field("sal")));
  85. //执行聚合
  86. AggregatedPage<Emp> search = (AggregatedPage)esDao.search(queryBuilder.build());
  87. //获取桶信息
  88. StringTerms sexGroup = (StringTerms) search.getAggregation("sexGroup");
  89. List<StringTerms.Bucket> buckets = sexGroup.getBuckets();
  90. //遍历桶数据
  91. for (StringTerms.Bucket bucket : buckets){
  92. System.out.println(bucket.getKeyAsString());
  93. System.out.println(bucket.getDocCount());
  94. InternalMax max = (InternalMax) bucket.getAggregations().asMap().get("maxSal");
  95. System.out.println(max.getValue());
  96. }
  97. }
  98. }
标签: java ide

本文转载自: https://blog.csdn.net/newoneobjectddd/article/details/123509946
版权归原作者 浪子-海 所有, 如有侵权,请联系我们删除。

“SpringBoot加ES整合的一些基本方法”的评论:

还没有评论