当前位置: 首页 > biancheng >正文

ElasticSearch_07_SpringBoot集成ES

系列文章目录

文章目录

  • 系列文章目录
  • 前言
  • 一、新建项目
  • 二、文档操作
    • 2.1 阶段一(直接查询)
      • 2.1.1 直接调用es的接口插入文档
      • 2.1.2 使用springboot接口插入文档
      • 2.1.3 使用springboot接口删除文档
    • 2.2 阶段二(添加上分组)
  • 总结

前言

一、新建项目

选择springboot项目,这里可以选择 custom 表示自定义,然后输入阿里的地址,这个是国内的,比较快

在这里插入图片描述

输入项目名称,可以随便输入,这里选择es4
在这里插入图片描述
先选择一个spring web依赖

在这里插入图片描述
再选择一个es依赖

在这里插入图片描述

然后写好 controller - service - mapper
在这里插入图片描述

二、文档操作

2.1 阶段一(直接查询)

// 查询document阶段1开始(没有拼装搜索条件,没有拼装返回结果)
@Override
public Map<String, Object> search(Map<String, Object> searchMap) {
    //条件封装
    NativeSearchQueryBuilder queryBuilder = queryBuilder(searchMap);

    //执行搜索
    Page<User> result = skuSearchMapper.search(queryBuilder.build());

    //结果集
    List<User> list = result.getContent();
    //记录数
    long totalElements = result.getTotalElements();

    Map<String,Object> resultMap = new HashMap<String,Object>();
    resultMap.put("list",list);
    resultMap.put("totalElements",totalElements);
    return resultMap;
}

/***
 * 搜索条件组装
 */
public NativeSearchQueryBuilder queryBuilder(Map<String,Object> searchMap){
    //QueryBuilder构建
    NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();

    //条件判断
    if(searchMap!=null && searchMap.size()>0){
        //关键词
        Object keywords =searchMap.get("keywords");
        if(!StringUtils.isEmpty(keywords)){
            queryBuilder.withQuery(QueryBuilders.termQuery("name",keywords.toString()));
        }
    }
    return queryBuilder;
}

2.1.1 直接调用es的接口插入文档

插入document()

http://192.168.100.170:9200/shopsearch/skues/1
{
    "id":1,
    "name":"mary",
    "address":"湖南",
    "age":12
}

在这里插入图片描述

查询指定index-type

localhost:8080/search

在这里插入图片描述

2.1.2 使用springboot接口插入文档

使用接口创建document

localhost:8080/search/add
{
    "id":2,
    "name":"bob",
    "address":"广东",
    "age":14
}

在这里插入图片描述

再次查找,多了一个document

localhost:8080/search

在这里插入图片描述

2.1.3 使用springboot接口删除文档

8080删除document

localhost:8080/search/del/1

在这里插入图片描述

第三次查询,id 为 1的湖南被删除掉了

localhost:8080/search

在这里插入图片描述

2.2 阶段二(添加上分组)

// 查询document阶段2开始(搜索条件中添加分组,返回结果中添加分组)
@Override
public Map<String, Object> search(Map<String, Object> searchMap) {
    //QueryBuilder->构建搜索条件
    NativeSearchQueryBuilder queryBuilder =queryBuilder(searchMap);
    //分组搜索调用
    group(queryBuilder,searchMap);


    //2.将非高亮数据替换成高亮数据
    AggregatedPage<User> result = (AggregatedPage<User>) skuSearchMapper.search(queryBuilder.build());
    //分组数据解析   将json变为map 返回给前端
    Map<String,Object> groups = parseGroup(result.getAggregations());

    //获取结果集:集合列表、总记录数
    Map<String,Object> resultMap = new HashMap<String,Object>();
    List<User> list = result.getContent();
    resultMap.put("list",list);
    resultMap.put("totalElements",result.getTotalElements());
    resultMap.putAll(groups);
    return resultMap;
}
public NativeSearchQueryBuilder queryBuilder(Map<String,Object> searchMap){
    //QueryBuilder构建
    NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();

    //条件判断
    if(searchMap!=null && searchMap.size()>0){
        //关键词
        Object keywords =searchMap.get("keywords");
        if(!StringUtils.isEmpty(keywords)){
            queryBuilder.withQuery(QueryBuilders.termQuery("name",keywords.toString()));
        }
    }
    return queryBuilder;
}
public void group(NativeSearchQueryBuilder builder,Map<String,Object> searchMap){
    //前端没有传入分类参数的时候查询分类集合作为搜索条件
    if(searchMap ==null || StringUtils.isEmpty(searchMap.get("address"))){
        //分类分组
        builder.addAggregation(AggregationBuilders
                .terms("addressList")  //查询的数据对应别名
                .field("address.keyword")         //根据categoryName分组
                .size(100));                    //分组查询100条
    }
    //前端没有传入品牌参数的时候查询品牌集合作为搜索条件
    if(searchMap ==null || StringUtils.isEmpty(searchMap.get("age"))){
        //品牌分组
        builder.addAggregation(AggregationBuilders
                .terms("ageList")     //查询的数据对应别名
                .field("age.keyword")            //根据brandName分组
                .size(100));                    //分组查询100条
    }
}
public Map<String,Object> parseGroup(Aggregations aggregations) {
    //所有分组数据
    Map<String,Object> groups = new HashMap<String,Object>();
    for (Aggregation aggregation : aggregations) {
        //强转成ParsedStringTerms
        ParsedStringTerms pst= (ParsedStringTerms) aggregation;

        //定义一个集合存储
        List<String> values = new ArrayList<String>();
        for (Terms.Bucket bucket : pst.getBuckets()) {
            //单个对象值
            values.add(bucket.getKeyAsString());
        }
        //存入到Map中
        groups.put(pst.getName(),values);
    }
    return groups;
}
//----- 阶段二完成

在这里插入图片描述

需要设置一下User类(文档类),要么标记为 Keyword ; 要么标记为Text,且设置为fielddata 为 true

在这里插入图片描述

执行分组查询

在这里插入图片描述

总结

相关文章:

  • 为什么要使用微软的 Application Framework?
  • 计算机网络(数据链路层,复习自用)
  • 【Linux】linux和Linus
  • 《C++高级编程》读书笔记(一:C++和标准库速成)
  • 设计模式(十):结构型之外观模式
  • TCP报文段结构
  • 嵌入式 - UART介绍
  • 如何构建记住用户输入文件 or 数据科?
  • 代码随想录第五十二天|最长子序列
  • Mybatis 学习笔记总结