1、聚合查询与去重

  //索引中去重
    AbstractAggregationBuilder skuGroupIdAgg = AggregationBuilders.cardinality("自己取的别名").field("skuGroupId");
  // 聚合查询,terms那是你自己取得别名  后面解析返回值的时候需要用到
   AbstractAggregationBuilder skuMetaAttrAgg = AggregationBuilders.terms("skuMetaAttrAgg ").field("skuMetaAttr").size(Integer.MAX_VALUE);
   //构建查询
   NativeSearchQueryBuilder  nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
   nativeSearchQueryBuilder.withQuery(boolQueryBuilder);
   nativeSearchQueryBuilder.addAggregation(a);  //将聚合信息添加到查询中
   //设置去重折叠字段
   nativeSearchQueryBuilder.withCollapseField("skuGroupId");
  //解析聚合返回值
   NativeSearchQuery  realQuery = nativeSearchQueryBuilder.build();
   SearchHits<ProductIndex> productIndexSearchHits = elasticUtil.getSearchClient().search(realQuery,ProductIndex.class);
    Aggregations  aggregations = productIndexSearchHits.getAggregations();
   List<String> skuMetaAttrs = Lists.newArrayList();
    ParsedStringTerms skuMetaAttrTerms = aggregations.get("skuMetaAttrAgg");
    if(null != skuMetaAttrTerms){
                List<? extends Terms.Bucket> skuMetaAttrBuckets = skuMetaAttrTerms.getBuckets();
                if(CollectionUtil.isNotEmpty(skuMetaAttrBuckets )){
                    for (Terms.Bucket bucket : skuMetaAttrBuckets ) {
                        skuMetaAttrs.add(bucket.getKeyAsString());
                    }
                }
            }
    //解析去重返回值
      Cardinality cardinality = aggregations.get("skuGroupIdAgg");
       if(null != aggregations && null != cardinality){
           //这是查询命中索引实际数量
             hitTotalNum = cardinality.getValue();
         }

2、排序以及完整查询

 //构建商品索引查询条件
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//多字段联合查询 设置权重
   Map<String,Float> fieldMap = Maps.newHashMap();
   fieldMap.put("skuName",10f);
   fieldMap.put("productAlias",10f);
   QueryBuilder virtualMatchQuery = QueryBuilders.multiMatchQuery(“要查询的值”,"skuName","virtualTitle","productAlias").operator(Operator.AND).fields(fieldMap);
   boolQueryBuilder.must(virtualMatchQuery );
 //聚合以及去重
  List<AbstractAggregationBuilder>  aggregationBuilderList = Lists.newArrayList();
 //根据组合关系id去重
 AbstractAggregationBuilder skuGroupIdAgg = AggregationBuilders.cardinality("skuGroupIdAgg").field("skuGroupId");
     aggregationBuilderList.add(skuGroupIdAgg);
 //商品类目聚合
  AbstractAggregationBuilder skuMetaAttrAgg = AggregationBuilders.terms("skuMetaAttrAgg ").field("skuMetaAttr").size(Integer.MAX_VALUE);
     aggregationBuilderList.add(skuMetaAttrAgg );
 //处理排序
  List<SortBuilder> sortBuilderList = Lists.newArrayList();
   //商品本身排序,倒序
  FieldSortBuilder skuSort = SortBuilders.fieldSort("skuSort").order(SortOrder.DESC);
    sortBuilderList.add(skuSort);
  //根据索引命中评分,倒序
   SortBuilder  scoreSort = SortBuilders.scoreSort().order(SortOrder.DESC);
   sortBuilderList.add(scoreSort);
  //构建查询
  NativeSearchQueryBuilder  nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
   nativeSearchQueryBuilder.withQuery(boolQueryBuilder);
   //聚合
   if(CollectionUtil.isNotEmpty(aggregationBuilderList)){
       aggregationBuilderList.stream().forEach(a ->{
           nativeSearchQueryBuilder.addAggregation(a);
       });
   }
   //需要查询索引的字段值
   nativeSearchQueryBuilder.withSourceFilter(new FetchSourceFilter(IndexConst.ES_RESULT_FIELDS,null));
   //排序
   if(CollectionUtil.isNotEmpty(sortBuilderList)){
       sortBuilderList.stream().forEach(s ->{
           nativeSearchQueryBuilder.withSort(s);
       });
   }
   //组合商品去重字段折叠
   nativeSearchQueryBuilder.withCollapseField("skuGroupId");
   //分页
   Pageable  pageable = PageRequest.of(start,rows);
   nativeSearchQueryBuilder.withPageable(pageable);
   NativeSearchQuery  realQuery = nativeSearchQueryBuilder.build();
   //查询ES
  SearchHits<ProductIndex>  productIndexSearchHits = elasticUtil.getSearchClient().search(realQuery,ProductIndex.class);
  //解析返回值。。。。。
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐