(三)ES聚合、去重查询以及排序
聚合、去重、排序、比较完全的查询
·
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);
//解析返回值。。。。。
更多推荐
已为社区贡献2条内容
所有评论(0)