SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); //构建 DSL 语句的
/**
* 模糊匹配,过滤(按照属性,分类,品牌,价格区间,库存)
*/
//1. 构建bool-query
BoolQueryBuilder boolQuery = new BoolQueryBuilder();
//1.1 bool-must
if(!StringUtils.isEmpty(param.getKeyword())){
boolQuery.must(QueryBuilders.matchQuery("skuTitle",param.getKeyword()));
}
//1.2 bool-fiter
//1.2.1 catelogId -- 按照三级分类id
if(null != param.getCatalog3Id()){
boolQuery.filter(QueryBuilders.termQuery("catelogId",param.getCatalog3Id()));
}
//1.2.2 brandId
if(null != param.getBrandId() && param.getBrandId().size() >0){
boolQuery.filter(QueryBuilders.termsQuery("brandId",param.getBrandId()));
}
//1.2.3 attrs
if(param.getAttrs() != null && param.getAttrs().size() > 0){
for(String attrStr : param.getAttrs()) {
//attrs=1_5寸:8寸&2_16G:8G
BoolQueryBuilder nestedboolQuery = QueryBuilders.boolQuery();
//attrs=1_5寸:8寸
String[] s = attrStr.split("_");
String attrId=s[0];
String[] attrValues = s[1].split(":");//这个属性检索用的值
boolQuery.must(QueryBuilders.termQuery("attrs.attrId",attrId));
boolQuery.must(QueryBuilders.termsQuery("attrs.attrValue",attrValues));
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery("attrs",nestedboolQuery, ScoreMode.None);
boolQuery.filter(nestedQuery);
}
// param.getAttrs().forEach(item -> {
// //attrs=1_5寸:8寸&2_16G:8G
// BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
//
//
// //attrs=1_5寸:8寸
// String[] s = item.split("_");
// String attrId=s[0];
// String[] attrValues = s[1].split(":");//这个属性检索用的值
// boolQuery.must(QueryBuilders.termQuery("attrs.attrId",attrId));
// boolQuery.must(QueryBuilders.termsQuery("attrs.attrValue",attrValues));
//
// NestedQueryBuilder nestedQueryBuilder = QueryBuilders.nestedQuery("attrs",boolQuery, ScoreMode.None);
// queryBuilder.filter(nestedQueryBuilder);
// });
}
//1.2.4 hasStock
if(null != param.getHasStock()){
boolQuery.filter(QueryBuilders.termQuery("hasStock",param.getHasStock() == 1));
}
//1.2.5 skuPrice
if(!StringUtils.isEmpty(param.getSkuPrice())){
//skuPrice形式为:1_500或_500或500_
RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("skuPrice");
String[] s = param.getSkuPrice().split("_");
if(s.length==2){
rangeQuery.gte(s[0]).lte(s[1]);
}else if(s.length == 1){
if(param.getSkuPrice().startsWith("_")){
rangeQuery.lte(s[1]);
}
if(param.getSkuPrice().endsWith("_")){
rangeQuery.gte(s[0]);
}
}
boolQuery.filter(rangeQuery);
}
//封装所有的查询条件
sourceBuilder.query(boolQuery);