14. es 整合springboot

拟墨画扇 提交于 2021-01-27 05:51:42

参考

https://blog.csdn.net/chen_2890/article/details/83895646

1.目的 

通过程序对es 进行增删改查

 

2. 实现过程

2.1 搭建springboot项目

 

 

 

手动加入lombok 的jar

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.8</version>
    <scope>provided</scope>
</dependency>

 

2.2 增加

配置数据源

##本项目端口号
server.port=8888

##es所在服务器地址  端口9300
spring.data.elasticsearch.cluster-nodes = localhost:9300

 

2.2.1 实体类 (很重要)

2.2.2 controller层

2.2.3 业务层

 

 

2.2.4 持久层

2.2.5 测试

 

 

es库中效果

2.3 删除

2.3.1 controller

2.3.2 业务层

 

 

2.3.3 测试

 

结果:

 

2.4 更新

这个操作与保存操作可以公用一个方法  ,当id相同的时候进行修改,不同的时候进行新增

2.5 查询

2.5.1 基本查询

2.5.1.1 查询所有 不用任何条件

效果:

(1)controller层

(2) 业务层

这里用到了jackson

 

实现类

 

在处理数据的时候看一下返回的数据结构:

 

2.5.1.2 根据某个字段进行排序

效果

(1) controller层

(2) 业务层

接口:

实现类:

 

2.5.1.3 根据id查询数据

 

(1)controller层

(2) 业务层

接口

实现类:

 

2.5.2  自定义方法查询

2.5.2.1 查询name相等的用户

效果:

代码:

(1)controller层

(2)业务层

接口:

实现类:

(3) 持久层

2.5.2.2 查询年龄相同 工作地点相同的人

效果:

(1)controller

(2) 业务层

接口

实现类:

持久层:

2.5.2.3  自定义方法Or查询 查询年龄=30 或  家住 深圳市的人

效果:

数据库中的数据

 

(1)controller

(2) 业务层

接口:

 

 

实现类:

(3) 持久层

2.5.2.4 自定义方法Between查询  查询年龄<=29 age >=30的人

效果

(1)controller层

(2) 业务层

接口

实现类:

(3)持久层

2.5.2.5  自定义方法like查询  查询名字含有 小的查询

效果:

(1) controller层

(2) 业务层

接口:

实现类:

(3)持久层

 

 

2.5.3 自定义查询

2.5.3.1  matchQuery(会分词  表中字段类型需要keyword) 

注意

 

(1) controller层

(2) 业务层

接口

实现类:

(3) 持久层

不需要写了

2.5.3.2 termQuery(不分词 表中字段类型是text类型)

效果:

情况1:type="text"   "analyzer": "ik_max_word"

情况2:type="text"    只能查询一个字

(1)controller层

(2) 业务层

接口

实现类:

2.5.3.3 fuzzyQuery 模糊查询   @Field(type = FieldType.Text)  类型必须是这个类型

效果:

(1) controller层

(2) 业务层

接口:

实现类:

 

2.5.4 分页查询

效果:

(1)controller层

(2)业务层

接口:

实现类:

 

 

2.5.5 排序

 

 

2.5.6 聚合

 

项目中:

2.5.6.1 按某个字段分组

需求:分组查询每个班级 学生数量

设计表:对于的统计的字段不能进行分组(type=“keyword”)

(1) controller层

(2) 业务层

接口:

    

 实现类:

//4.6.1 根据某个字段进行分组查询
@Override
public String polymerizationByColumn(String column) throws JsonProcessingException {
    //造一个list用于存放数据
    ArrayList<Map<String, Object>> list = new ArrayList<>();
    NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
    // 不查询任何结果
    queryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{""}, null));
    // 1、添加一个新的聚合,聚合类型为terms,聚合名称为brands,聚合字段为column
    queryBuilder.addAggregation(
            AggregationBuilders.terms(column).field(column));
    // 2、查询,需要把结果强转为AggregatedPage类型
    AggregatedPage<Student> aggPage = (AggregatedPage<Student>) this.esRepository.search(queryBuilder.build());
    // 3、解析
    // 3.1、从结果中取出名为brands的那个聚合,
    // 因为是利用String类型字段来进行的term聚合,所以结果要强转为StringTerm类型
    StringTerms agg = (StringTerms) aggPage.getAggregation(column);
    // 3.2、获取桶
    List<StringTerms.Bucket> buckets = agg.getBuckets();
    // 3.3、遍历
    for (StringTerms.Bucket bucket : buckets) {
        HashMap<String, Object> map = new HashMap<>();
        // 3.4、获取桶中的key,即班级名称
        map.put("class", bucket.getKeyAsString());
        // 3.5、获取桶中的文档数量  既各个班级下学生数量
        map.put("num", bucket.getDocCount());
        //将数据放入list
        list.add(map);
    }
    //数据处理为json
    String jsonData = JacksonUtils.obejectToJson(list);
    return jsonData;
}

 

3.附(源码及参考博客)

链接:https://pan.baidu.com/s/1hgXLhHs75CF35EI3cwnvfw 
提取码:eg03 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!