【easy-ES使用】1.基础操作:增删改查、批量操作、分词查询、聚合处理。

easy-es、elasticsearch、分词器 与springboot 结合的代码我这里就不放了,我这里直接是使用代码。

基础准备:

创建实体类:
@Data
// 索引名
@IndexName("test_jc")
public class TestJcES {
	// id注解
    @IndexId(type = IdType.CUSTOMIZE)
    private Long id;
	// 如果需要分词查询,必须  FieldType.TEXT  analyzer = "ik_max_word" 官网有说明
    @IndexField(fieldType = FieldType.TEXT,  analyzer = "ik_max_word")
    private String name;

	// 非分词查询类型 最好用 KEYWORD
    @IndexField(fieldType = FieldType.KEYWORD)
    private String sex;
    
	/**
     * [描述] 如果某字段数组类型,并且该类型后期需要聚合操作,必须 fieldData = true
     * FieldType.TEXT:会将数组中的元素 “拆分单字符” 进行聚合
     * FieldType.KEYWORD: 会对数组中的元素进行聚合
     */
    @IndexField(fieldType = FieldType.TEXT,fieldData = true)
    private List<String> industryTags;
    @IndexField(fieldType = FieldType.KEYWORD,fieldData = true)
    private List<String> productTags;

	//时间类型
    @IndexField(fieldType = FieldType.DATE, dateFormat = "yyyy-MM-dd HH:mm:ss")
    private String updateTime;
    @IndexField(fieldType = FieldType.DATE, dateFormat = "yyyy-MM-dd HH:mm:ss")
    private String createTime;

    public TestJcES(Long id,String name, List<String> industryTags, List<String> productTags) {
    	this.id = id;
        this.name = name;
        this.industryTags = industryTags;
        this.productTags = productTags;
    }
}
PS:在easy-es的注解 @IndexFiled 中源码会有说明:

在这里插入图片描述

对应的mapper:
// BaseEsMapper  来自 easy-es框架
public interface TestJcESMapper extends cn.easyes.core.core.BaseEsMapper<TestJcES> {
}

增删改(带批量):

		testJcESMapper.deleteIndex("test_jd");
        testJcESMapper.createIndex("test_jd");
        TestJcES es = new TestJcES(1L,"小红",29,Arrays.asList("分类1","分类2","分类3"),Arrays.asList("标签1","标签2"));
        TestJcES es2 = new TestJcES(2L,"小白",29,Arrays.asList("分类1","分类3"),Arrays.asList("标签1","标签3"));
        TestJcES es3 = new TestJcES(3L,"小黑",30,Arrays.asList("分类4"),Arrays.asList("标签1"));
        TestJcES es4 = new TestJcES(4L,"小明",18,Arrays.asList("分类1"),Arrays.asList("标签1","标签2","变迁3"));
        testJcESMapper.insertBatch(Arrays.asList(es,es2,es3,es4));

        //批量更新
        //testJcESMapper.updateBatchByIds(Arrays.asList(es,es2,es3,es4));
        //批量删除
        //testJcESMapper.deleteBatchIds(Arrays.asList(1L,2L, 3L, 4L));

        LambdaEsQueryWrapper<TestJcES> query = new LambdaEsQueryWrapper<>();

        //相当于 select * from test_jc where name like '%红%' and sex = 29 and industryTags in ('标签1','标签2')
        query.and(item->item.match(TestJcES::getName, "红"));
        query.and(item->item.match(TestJcES::getSex, 29));
        
        query.in("industryTags",Arrays.asList("标签1","标签2"));
        // 默认按查询度倒叙
		lambdaEsQueryWrapper.sortByScore(SortOrder.DESC);
        //注意:从1开始起步 不是从0开始
        EsPageInfo<TestJcES> pageQuery = testJcESMapper.pageQuery(query, 1, 10);
        //查询数据
        System.out.println(pageQuery.getList());
        //总条数
        System.out.println(pageQuery.getTotal());
        //总页数
        System.out.println(pageQuery.getPages());


聚合操作:

1.普通keyword类型字段聚合:
        LambdaEsQueryWrapper<TestJcES> query = new LambdaEsQueryWrapper<>();
        //TODO 这里也可以通过query带条件进行聚合
        //比如: query.match(TestJcES::getName, "红");

	// 这里类似 select * from test_jc group by sex 
        String filedName = "sex";
        query.groupBy(filedName);
        // 是否统计hits的数据总数 设置为0 则不统计 数据量大的时候聚合速度会更快一些
        //query.size(0);
        SearchResponse searchResponse = testJcESMapper.search(query);
        //7. 获取命中对象 SearchHits
        SearchHits hits = searchResponse.getHits();
        //7.1 获取总记录数 如果 query.size(0) 则这里值就为0
        Long total= hits.getTotalHits().value;
        System.out.println("被聚合的数据总条数:"+total);
        // aggregations 对象
        Aggregations aggregations = searchResponse.getAggregations();
        //将aggregations 转化为map
        Map<String, Aggregation> aggregationMap = aggregations.asMap();
        //通过key获取 filedName+"Terms" 对象 使用Aggregation的子类接收  buckets属性在Terms接口中体现
        //        Aggregation goods_brands1 = aggregationMap.get(filedName+"Terms");
        Terms resultTerms =(Terms) aggregationMap.get(filedName+"Terms");
        //获取buckets 数组集合
        List<? extends Terms.Bucket> buckets = resultTerms.getBuckets();
        Map<String,Object>map=new HashMap<>();
        //遍历buckets   key 属性名,doc_count 统计聚合数
        for (Terms.Bucket bucket : buckets) {
            System.out.println(bucket.getKey());
            System.out.println(bucket.getDocCount());
            map.put(bucket.getKeyAsString(),bucket.getDocCount());
        }

聚合效果:
在这里插入图片描述

2.数组(text类型)类型聚合:

        LambdaEsQueryWrapper<TestJcES> query = new LambdaEsQueryWrapper<>();
        //TODO 这里也可以通过query带条件进行聚合
        //比如: query.match(TestJcES::getName, "红");


        String filedName = "industryTags";
        query.groupBy(filedName);
        // 是否统计hits的数据总数 设置为0 则不统计 数据量大的时候聚合速度会更快一些
        //query.size(0);
        SearchResponse searchResponse = testJcESMapper.search(query);
        //7. 获取命中对象 SearchHits
        SearchHits hits = searchResponse.getHits();
        //7.1 获取总记录数 如果 query.size(0) 则这里值就为0
        Long total= hits.getTotalHits().value;
        System.out.println("被聚合的数据总条数:"+total);
        // aggregations 对象
        Aggregations aggregations = searchResponse.getAggregations();
        //将aggregations 转化为map
        Map<String, Aggregation> aggregationMap = aggregations.asMap();
        //通过key获取 filedName+"Terms" 对象 使用Aggregation的子类接收  buckets属性在Terms接口中体现
        //        Aggregation goods_brands1 = aggregationMap.get(filedName+"Terms");
        Terms resultTerms =(Terms) aggregationMap.get(filedName+"Terms");
        //获取buckets 数组集合
        List<? extends Terms.Bucket> buckets = resultTerms.getBuckets();
        Map<String,Object>map=new HashMap<>();
        //遍历buckets   key 属性名,doc_count 统计聚合数
        for (Terms.Bucket bucket : buckets) {
            System.out.println(bucket.getKey());
            System.out.println(bucket.getDocCount());
            map.put(bucket.getKeyAsString(),bucket.getDocCount());
        }


如果实体类的属性类型采用 text,则会把该属性里面的所有值分词然后进行聚合:
在这里插入图片描述
聚合效果:
在这里插入图片描述

2.数组(keyword类型)类型聚合:
        LambdaEsQueryWrapper<TestJcES> query = new LambdaEsQueryWrapper<>();
        //TODO 这里也可以通过query带条件进行聚合
        //比如: query.match(TestJcES::getName, "红");

	// 类似  select * from test_jc group by productTags
        String filedName = "productTags";
        query.groupBy(filedName);
        // 是否统计hits的数据总数 设置为0 则不统计 数据量大的时候聚合速度会更快一些
        //query.size(0);
        SearchResponse searchResponse = testJcESMapper.search(query);
        //7. 获取命中对象 SearchHits
        SearchHits hits = searchResponse.getHits();
        //7.1 获取总记录数 如果 query.size(0) 则这里值就为0
        Long total= hits.getTotalHits().value;
        System.out.println("被聚合的数据总条数:"+total);
        // aggregations 对象
        Aggregations aggregations = searchResponse.getAggregations();
        //将aggregations 转化为map
        Map<String, Aggregation> aggregationMap = aggregations.asMap();
        //通过key获取 filedName+"Terms" 对象 使用Aggregation的子类接收  buckets属性在Terms接口中体现
        //        Aggregation goods_brands1 = aggregationMap.get(filedName+"Terms");
        Terms resultTerms =(Terms) aggregationMap.get(filedName+"Terms");
        //获取buckets 数组集合
        List<? extends Terms.Bucket> buckets = resultTerms.getBuckets();
        Map<String,Object>map=new HashMap<>();
        //遍历buckets   key 属性名,doc_count 统计聚合数
        for (Terms.Bucket bucket : buckets) {
            System.out.println(bucket.getKey());
            System.out.println(bucket.getDocCount());
            map.put(bucket.getKeyAsString(),bucket.getDocCount());
        }

聚合效果:
es聚合强大的地方在于,会把属性为数组拆分元素进行聚合统计,一般来说,普通统计用到这里就完全足够了。
在这里插入图片描述

PS 另外附赠elasticsearch通用聚合方法:

    /**
     * [描述]
     */
   private List<Map<String,Object>> commonGroup3(TestJcES search , String fieldName) {
       // 创建一个布尔查询来组合多个条件
       BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
       if (StringUtils.isNotBlank(search.getName())) {
           boolQuery.should(QueryBuilders.multiMatchQuery(search.getName(), "name"));
       }
       if(search.getProductTags() != null){
           boolQuery.should(QueryBuilders.matchQuery("productTags",
                   search.getProductTags()));
       }

       return commonGroupByBoolQuery(fieldName, boolQuery,"test_jc");
   }


    /**
     * 根据布尔查询创建一个过滤聚合,并返回基于指定字段的聚合结果
     * @param fieldName 指定的字段名
     * @param boolQuery 基于该布尔查询创建过滤聚合
     * @param indexName 索引名称
     * @return 基于指定字段的聚合结果列表,每个结果包含字段名和计数
     */
    private List<Map<String, Object>> commonGroupByBoolQuery(String fieldName, BoolQueryBuilder boolQuery
    ,String indexName) {
        // 创建一个过滤聚合,基于布尔查询
        FilterAggregationBuilder filterAgg = AggregationBuilders.filter("filtered_agg", boolQuery);
        // 在过滤后的文档上创建其他聚合
        TermsAggregationBuilder termsAgg = AggregationBuilders.terms("agg_field")
                .field(fieldName);
        // 将聚合添加到过滤聚合中
        filterAgg.subAggregation(termsAgg);
        SearchRequest searchRequest = new SearchRequest(indexName);
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        // 添加聚合到搜索源构建器
        sourceBuilder.aggregation(filterAgg);
        searchRequest.source(sourceBuilder);
        try {
            SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
            // 获取聚合结果
            Filter filteredAggregation = searchResponse.getAggregations().get("filtered_agg");
            Terms yourFieldAggregation = filteredAggregation.getAggregations().get("agg_field");
            return yourFieldAggregation.getBuckets().stream()
                    .map(item -> {
                        Map<String, Object> map = new HashMap<>(2);
                        map.put("name", item.getKeyAsString());
                        map.put("count", item.getDocCount());
                        return map;

                    })
                    .collect(Collectors.toList());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return List.of();
    }

另附easy-es官网地址:
https://www.easy-es.cn/pages/ce1922/#%E5%B8%B8%E8%A7%84%E8%81%9A%E5%90%88
官网很完整的demo:
https://www.easy-es.cn/pages/17ea0a/#%E4%BC%98%E5%8A%BF%E5%AF%B9%E6%AF%94

部分es教程博客:
https://blog.csdn.net/weixin_46115287/article/details/120974337

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1363157985066 13726230503 00-FD-07-A4-72-B8:CMCC 120.196.100.82 i02.c.aliimg.com 24 27 2481 24681 200 1363157995052 13826544101 5C-0E-8B-C7-F1-E0:CMCC 120.197.40.4 4 0 264 0 200 1363157991076 13926435656 20-10-7A-28-CC-0A:CMCC 120.196.100.99 2 4 132 1512 200 1363154400022 13926251106 5C-0E-8B-8B-B1-50:CMCC 120.197.40.4 4 0 240 0 200 1363157993044 18211575961 94-71-AC-CD-E6-18:CMCC-EASY 120.196.100.99 iface.qiyi.com 视频网站 15 12 1527 2106 200 1363157995074 84138413 5C-0E-8B-8C-E8-20:7DaysInn 120.197.40.4 122.72.52.12 20 16 4116 1432 200 1363157993055 13560439658 C4-17-FE-BA-DE-D9:CMCC 120.196.100.99 18 15 1116 954 200 1363157995033 15920133257 5C-0E-8B-C7-BA-20:CMCC 120.197.40.4 sug.so.360.cn 信息安全 20 20 3156 2936 200 1363157983019 13719199419 68-A1-B7-03-07-B1:CMCC-EASY 120.196.100.82 4 0 240 0 200 1363157984041 13660577991 5C-0E-8B-92-5C-20:CMCC-EASY 120.197.40.4 s19.cnzz.com 站点统计 24 9 6960 690 200 1363157973098 15013685858 5C-0E-8B-C7-F7-90:CMCC 120.197.40.4 rank.ie.sogou.com 搜索引擎 28 27 3659 3538 200 1363157986029 15989002119 E8-99-C4-4E-93-E0:CMCC-EASY 120.196.100.99 www.umeng.com 站点统计 3 3 1938 180 200 1363157992093 13560439658 C4-17-FE-BA-DE-D9:CMCC 120.196.100.99 15 9 918 4938 200 1363157986041 13480253104 5C-0E-8B-C7-FC-80:CMCC-EASY 120.197.40.4 3 3 180 180 200 1363157984040 13602846565 5C-0E-8B-8B-B6-00:CMCC 120.197.40.4 2052.flash2-http.qq.com 综合门户 15 12 1938 2910 200 1363157995093 13922314466 00-FD-07-A2-EC-BA:CMCC 120.196.100.82 img.qfc.cn 12 12 3008 3720 200 1363157982040 13502468823 5C-0A-5B-6A-0B-D4:CMCC-EASY 120.196.100.99 y0.ifengimg.com 综合门户 57 102 7335 110349 200 1363157986072 18320173382 84-25-DB-4F-10-1A:CMCC-EASY 120.196.100.99
06-09

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值