美文网首页Elasticsearch
springframework.data.elasticsear

springframework.data.elasticsear

作者: rainbowz | 来源:发表于2020-10-14 14:58 被阅读0次
    Data
    @Document(indexName = "sku_info", type = "docs")
    public class SkuInfo implements Serializable {
    
        @Id
        private Long id;//商品id,同时也是商品编号
    
        /**
         * SKU名称
         * FieldType.Text支持分词
         * analyzer 创建索引的分词器
         * searchAnalyzer 搜索时使用的分词器
         */
        @Field(type = FieldType.Text, analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")
        private String name;
    
        @Field(type = FieldType.Double)
        private Long price;//商品价格,单位为:元
    
        private Integer num;//库存数量
    
        private String image;//商品图片
    
        private String status;//商品状态,1-正常,2-下架,3-删除
    
        @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd")
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        @JsonSerialize(using = LocalDateTimeSerializer.class)
        @JsonDeserialize(using = LocalDateTimeDeserializer.class)
        private LocalDateTime createTime;//创建时间
    
        @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd")
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        @JsonSerialize(using = LocalDateTimeSerializer.class)
        @JsonDeserialize(using = LocalDateTimeDeserializer.class)
        private LocalDateTime updateTime;//更新时间
    
        private String isDefault; //是否默认
    
        private Long spuId;//SPU_ID
    
        private Long categoryId;//类目ID
    
        @Field(type = FieldType.Keyword)
        private String categoryName;//类目名称,不分词
    
        @Field(type = FieldType.Keyword)
        private String brandName;//品牌名称,不分词
    
        private String spec;//规格
    
        private Map<String, Object> specMap;//规格参数
    
    }
    
    1字段匹配查询
     // 构建查询条件
            NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
            // 添加基本的分词查询
            queryBuilder.withQuery(QueryBuilders.termQuery("name", "啄木鸟"));
    
            // 排序
            queryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.DESC));
    
            // 执行搜索,获取结果
            Page<SkuInfo> items = skuEsMapper.search(queryBuilder.build());
            // 打印总条数
            System.out.println(items.getTotalElements());
            items.forEach(System.out::println);
    
    2布尔分组查询
    NativeSearchQuery searchQuery =new NativeSearchQueryBuilder()
                    .withQuery(QueryBuilders.boolQuery()
                    .should(QueryBuilders.termQuery("name","啄木鸟")))
                    .withSort(SortBuilders.fieldSort("price").order(SortOrder.DESC))
                    .build();
            Page<SkuInfo> search = skuEsMapper.search(searchQuery);
            System.out.println("总条数:" + search.getTotalElements());
            System.out.println("总页数:" + search.getTotalPages());
    
            for(SkuInfo skuInfo : search ){
                System.out.println(skuInfo.toString());
            }
    
    
    3聚合为桶查找平均值
    NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
            // 不查询任何结果
            queryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{""}, null));
            // 1、添加一个新的聚合,聚合类型为terms,聚合名称为brands,聚合字段为brand
            queryBuilder.addAggregation(
                    AggregationBuilders.terms("brands").field("brandName")
                            .subAggregation(AggregationBuilders.avg("priceAvg").field("price")) // 在品牌聚合桶内进行嵌套聚合,求平均值
    
            );
            // 2、查询,需要把结果强转为AggregatedPage类型
            AggregatedPage<SkuInfo> aggPage = (AggregatedPage<SkuInfo>) this.skuEsMapper.search(queryBuilder.build());
            // 3、解析
            // 3.1、从结果中取出名为brands的那个聚合,
            // 因为是利用String类型字段来进行的term聚合,所以结果要强转为StringTerm类型
            StringTerms agg = (StringTerms) aggPage.getAggregation("brands");
            // 3.2、获取桶
            List<StringTerms.Bucket> buckets = agg.getBuckets();
            // 3.3、遍历
            for (StringTerms.Bucket bucket : buckets) {
                // 3.4、获取桶中的key,即品牌名称  3.5、获取桶中的文档数量
                System.out.println(bucket.getKeyAsString() + ",共" + bucket.getDocCount() + "台");
    
                // 3.6.获取子聚合结果:
                InternalAvg avg = (InternalAvg) bucket.getAggregations().asMap().get("priceAvg");
                System.out.println("平均售价:" + avg.getValue());
    }
    
    elasticsearchRestTemplate.queryForList是查询一个列表,用的就是ElasticsearchRestTemplate的一个对象实例;
    NativeSearchQuery :是springdata中的查询条件;
    NativeSearchQueryBuilder :用于建造一个NativeSearchQuery查询对象;
    QueryBuilders :设置查询条件,是ES中的类;
    SortBuilders :设置排序条件;
    HighlightBuilder :设置高亮显示;
    

    link
    ElasticSearch系列(六)springboot中使用QueryBuilders、NativeSearchQuery实现复杂查询
    https://blog.csdn.net/csdn_20150804/article/details/105618933

    相关文章

      网友评论

        本文标题:springframework.data.elasticsear

        本文链接:https://www.haomeiwen.com/subject/xdqwpktx.html