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 工具类来构建具体的查询条件,敬请期待。