0
点赞
收藏
分享

微信扫一扫

ElasticSearch_08_SpringBoot集成ES


系列文章目录

文章目录

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

前言

一、新建项目

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

ElasticSearch_08_SpringBoot集成ES_spring

输入项目名称,可以随便输入,这里选择es4

ElasticSearch_08_SpringBoot集成ES_spring_02


先选择一个spring web依赖

ElasticSearch_08_SpringBoot集成ES_spring boot_03


再选择一个es依赖

ElasticSearch_08_SpringBoot集成ES_java_04

然后写好 controller - service - mapper

ElasticSearch_08_SpringBoot集成ES_搜索_05

二、文档操作

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
}

ElasticSearch_08_SpringBoot集成ES_elasticsearch_06

查询指定index-type

localhost:8080/search

ElasticSearch_08_SpringBoot集成ES_spring boot_07

2.1.2 使用springboot接口插入文档

使用接口创建document

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

ElasticSearch_08_SpringBoot集成ES_spring boot_08

再次查找,多了一个document

localhost:8080/search

ElasticSearch_08_SpringBoot集成ES_spring_09

2.1.3 使用springboot接口删除文档

8080删除document

localhost:8080/search/del/1

ElasticSearch_08_SpringBoot集成ES_elasticsearch_10

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

localhost:8080/search

ElasticSearch_08_SpringBoot集成ES_elasticsearch_11

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;
}

ElasticSearch_08_SpringBoot集成ES_spring boot_12

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

ElasticSearch_08_SpringBoot集成ES_java_13

执行分组查询

ElasticSearch_08_SpringBoot集成ES_elasticsearch_14

2.3 阶段三

总结


举报

相关推荐

0 条评论