《Elasticsearch通用查询方案(一):开篇与基础概念》

Elasticsearch通用查询方案

《通用查询方案(一):开篇与基础概念》

《通用查询方案(二):QueryConditionBuilders 工具类》

《通用查询方案(三):QueryBuilderFactory 组件》

《通用查询方案(四):QueryCondition 使用指南与实战》



引言

众所周知,Elasticsearch支持丰富的各类查询,同时Elasticsearch广泛应用于我们日常开发工作中。此时,一个高效、灵活且易于维护的通用查询能力堪称提升程序员体验、保障系统性能的关键所在。本文将尝试深入探索一种通用查询技术方案,旨在提供一种标准化、可扩展的方式来构建查询功能。它通过一系列精心设计的组件和规范,使得开发者能够轻松地创建各种类型的查询条件,并将其转换为Elasticsearch能够理解和执行的查询语句。这种方案的核心优势在于其灵活性,能够适应不同业务场景下的查询需求,无论是简单的单条件查询,还是复杂的多条件逻辑嵌套、组合查询,都能游刃有余地应对。


本篇文章介绍通用方案的整体核心组件基石:词汇表、容器

一、查询条件操作符枚举(OperatorEnum)

这是整个查询体系的 “词汇表”,定义了一系列的预定义的丰富多样的操作符,用于表示不同类型的查询或者逻辑组合操作

1、条件查询类:

EQ:用于精准匹配,像查找特定用户的用户名是否等于某个确切值;
NE:用于精准匹配,像查找特定用户的用户名不等于某个确切值;
GT、GTE、LT、LTE:专注于数值范围比较,例如筛选出价格高于某个阈值的商品;
NOT_IN、IN:把控集合成员关系,判断某个元素是否在指定集合内;
RANGE:灵活处理区间查询;
WILDCARD:借助通配符实现模糊匹配;
CONTAINS:检查字段是否包含特定子串;
EXISTS:聚焦字段是否存在;
NESTED_EQ :嵌套对象等于条件下的查询;

2、逻辑组合类:

MUST、MUST_NOT、SHOULD:用于构建复杂多条件逻辑

以上每个枚举成员清晰界定了一种数据筛选规则,为后续查询条件的精准构建奠定基础,同时还支持持续扩展操作符枚举,比如嵌套条件的等于、大于、小于等等;通过使用枚举,我们不仅提高了代码的可读性,还能在编译时进行类型检查,减少错误的发生。

代码如下:

public enum OperatorEnum {
    EQ("eq", "等于)"),
    GT("gt", "大于"),
    GTE("gte", "大于等于"),
    LT("lt", "小于"),
    LTE("lte", "小于等于"),
    NOT_IN("not_in", "不在指定集合中"),
    IN("in", "在指定集合中"),
    RANGE("range", "区间查询"),
    WILDCARD("wildcard", "通配符匹配"),
    CONTAINS("contains", "包含(模糊匹配相关)"),
    EXISTS("exists", "字段是否存在"),
    MUST("must", "必须满足的条件(逻辑组合)"),
    MUST_NOT("must_not", "必须不满足的条件(逻辑组合)"),
    SHOULD("should", "可以满足的条件(逻辑组合)"),
    NESTED_EQ("nested_eq", "嵌套对象精确匹配"),
    NE("ne", "不等于");

    private final String code;
    private final String description;

    OperatorEnum(String code, String description) {
        this.code = code;
        this.description = description;
    }

    public String getCode() {
        return code;
    }

    public String getDescription() {
        return description;
    }
}

二、查询条件实体类(QueryCondition)

作为承载查询关键信息的 “容器”,QueryCondition 实体类身负重任;
它是表示查询条件的抽象契约,用于保存和获取查询条件的关键信息,包括字段名、操作符以及操作数等,任何类型的查询条件都需要通过这个类创建,从而实现统一的处理和管理。
其属性各司其职:field 明确查询字段,精准定位数据列;operator 关联 OperatorEnum,确定筛选方式;operand 适配不同操作符需求,容纳单个值或值集合;isComposite 巧妙区分简单与复合条件。
通过合理构造函数初始化以及便捷访问方法,保障查询条件在系统内有序流转,无论是构建单一条件,还是组合复杂查询逻辑,它都是不可或缺的核心要素。

代码如下:

import java.io.Serializable;

public class QueryCondition implements Serializable {
    //查询哪一个字段
    private String field;
    //操作符
    private OperatorEnum operator;
    //值
    private Object operand;
    //是否逻辑组合
    private boolean isComposite;

    public QueryCondition(String field, OperatorEnum operator, Object operand, boolean isComposite) {
        this.field = field;
        this.operator = operator;
        this.operand = operand;
        this.isComposite = isComposite;
    }

    public String getField() {
        return field;
    }

    public OperatorEnum getOperator() {
        return operator;
    }

    public Object getOperand() {
        return operand;
    }

    public boolean isComposite() {
        return isComposite;
    }
}

后续

后续系列文章,我们将逐步深入各个关键组件与技术要点,从工具类的巧妙运用,到组件间的协同作战,再到实战场景下复杂需求的攻克,一一揭晓这套通用查询方案的设计;下一篇文章,将详细探讨如何使用 QueryConditionBuilders 工具类来构建具体的查询条件,敬请期待。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值