如何优化Ranger的区间筛选
DSL语句:
Java代码:
ArrayList<Query> queryList = new ArrayList<>();
//过滤条件5: 根据是价格区间进行过滤查询; 传入的参数大致类型 “8000_10000”
if (StringUtils.hasLength(param.getSkuPrice())) {
//将页面传递的价格区间进行切割
String[] s = param.getSkuPrice().split("_");
//区间判断==》范围传值
if (s.length == 2) {
Query skuPrices = RangeQuery.of(f5 -> f5
.field("skuPrice")
.gte(JsonData.fromJson(s[0]))
.lte(JsonData.fromJson(s[1])))
._toQuery();
//放入过滤集合
queryList.add(skuPrices);
} else if (s.length == 1) {
//如果传递的是一个值"_8000"这种就是放走末尾
if (param.getSkuPrice().startsWith("_")) {
Query skuPrices = RangeQuery.of(f5 -> f5
.field("skuPrice")
.lte(JsonData.fromJson(s[0])))
._toQuery();
//放入过滤集合
queryList.add(skuPrices);
}
//如果传递的是一个值"8000_"这种就是放走前面
if (param.getSkuPrice().endsWith("_")) {
Query skuPrices = RangeQuery.of(f5 -> f5
.field("skuPrice")
.gte(JsonData.fromJson(s[0])))
._toQuery();
//放入过滤集合
queryList.add(skuPrices);
}
}
}
最后在在Search里面进行查询
需要改动的代码片段放到这,可以试用下
.filter(f -> f.rage(builder -> {
String paramPrice = param.getSkuPrice();
if (StringUtils.hasLength(paramPrice)) {
Sting[] s = paramPrice.split("_");
if (s.length == 2) {
builder.field("skuPrice");
builder.gte(JsonData.fromJson(s[0]));
builder.lte(JsonData.fromJson(s[1]));
} else if (s.length == 1) {
if (paramPrice.startWith("_")) {
builder.field("skuPrice");
builder.lte(JsonData.fromJson(s[0]));
}
if (paramPrice.endWith("_")) {
builder.field("skuPrice");
builder.gte(JsonData.fromJson(s[0]));
}
}
}
return builder;
}));