0


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

1、导入Elasticsearch依赖

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

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

<parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <version>2.1.18.RELEASE</version>
</parent>

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

spring:
  data:
    elasticsearch:
      cluster-name: elasticsearch
      cluster-nodes: 192.168.71.120:9300

3、实体类

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

4、启动类

@SpringBootApplication
public class EsDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(EsDemoApplication.class);
    }
}

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

先看看Dao持久层

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

测试类

@SpringBootTest
@RunWith(SpringRunner.class)
public class EsTest {
    @Autowired  //持久层对象
    private EsDao esDao;
    @Autowired  //ES模板对象
    private ElasticsearchTemplate template;

    @After
    public void finish(){
        System.out.println("已完成。。。。");
    }
    @Test
    public void test(){
        //创建索引,会根据 Emp 类的@Document注解信息来创建
        template.createIndex(Emp.class);
        //映射配置,会根据 Emp 类中的id、Field等字段来自动完成映射
        template.putMapping(Emp.class);
    }
    @Test//插入单个对象
    public void test2(){
        Emp emp = new Emp(1000, "xxx", "xx", "x", 8000.0, new Date());
        esDao.save(emp);
    }
    @Test//批量插入
    public void test3(){
        List<Emp> list = new ArrayList<>();
        list.add(new Emp(1001, "xxxx", "xxx", "x", 7000.0, new Date()));
        list.add(new Emp(1002, "xxxx", "xxx", "x", 6000.0, new Date()));
        list.add(new Emp(1003, "xxxx", "xxx", "x", 5000.0, new Date()));
        esDao.saveAll(list);//saveAll可以插入用集合批量插入
    }
    @Test //排序查询
    public void test4(){
        //查询所有
        //Iterable<Emp> list = esDao.findAll();
        //进行排序查询
        Iterable<Emp> list = esDao.findAll(Sort.by(Sort.Direction.DESC,"sal"));
        list.forEach(System.out::println);
    }
    @Test    //自定义sql语句方法
    public void  test5(){
        //findByNameLike() Dao层自定义方法  根据name进行模糊查询
        //List<Emp> list = esDao.findByNameLike("x");
        //根据name,sex,进行name模糊查询和指定sex查询
        List<Emp> list1 = esDao.findByNameLikeAndSex("x","x");
        list1.forEach(System.out::println);
    }
    @Test//ES分词查询
    public void  test7(){
        //词条条件  查询条件
        MatchQueryBuilder builder = QueryBuilders.matchQuery("address", "中国广东");
        //进行查询
        Iterable<Emp> list = esDao.search(builder);
        list.forEach(System.out::println);
    }
    @Test//综合分页查询
    public void  test8(){
        //构建查询条件对象  可以理解为存放查询条件的一个容器
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
        //设置查询条件  设置条件根据address字段将 中国xx 进行分词查询
        queryBuilder.withQuery(QueryBuilders.matchQuery("address","中国xx"));

        //设置分页条件
        int pageNo = 0;
        int pageSize = 3;
        //PageRequest.of()可以在这个方法内放入需要分页的条件
        queryBuilder.withPageable(PageRequest.of(pageNo,pageSize));

        //排序
        queryBuilder.withSort(SortBuilders.fieldSort("sal").order(SortOrder.DESC));

        //按照条件进行查询 返回 page 对象实现分页
        Page<Emp> page = esDao.search(queryBuilder.build());
        //输出查询的数量
        System.out.println(page.getTotalElements());
        //输出查询的数据详情
        page.getContent().forEach(System.out::println);
    }
    @Test
    public void  test9(){
        //查询构建器
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
        //不要明细
        queryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{""}, null));
        //添加聚合  进行分组
                queryBuilder.addAggregation(AggregationBuilders.terms("sexGroup").field("sex")
                    .subAggregation(AggregationBuilders.max("maxSal").field("sal")));

        //执行聚合
        AggregatedPage<Emp> search = (AggregatedPage)esDao.search(queryBuilder.build());
        //获取桶信息
        StringTerms sexGroup = (StringTerms) search.getAggregation("sexGroup");
        List<StringTerms.Bucket> buckets = sexGroup.getBuckets();
        //遍历桶数据
        for (StringTerms.Bucket bucket : buckets){
            System.out.println(bucket.getKeyAsString());
            System.out.println(bucket.getDocCount());
            InternalMax max = (InternalMax) bucket.getAggregations().asMap().get("maxSal");
            System.out.println(max.getValue());
        }
    }

}
标签: java ide

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

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

还没有评论