优化Java API操作ES

如何优化Ranger的区间筛选
DSL语句:

img

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里面进行查询

img

需要改动的代码片段放到这,可以试用下

.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;
}));