Elasticsearch通用查询方案
《通用查询方案(一):开篇与基础概念》
《通用查询方案(二):QueryConditionBuilders 工具类》
《通用查询方案(三):QueryBuilderFactory 组件》
《通用查询方案(四):QueryCondition 使用指南与实战》
文章目录
前言
在通用接口查询的舞台上,QueryCondition 是绝对的主角之一,携手 QueryConditionBuilders,为精准数据检索拉开大幕。今天咱们抛开繁文缛节,直击实战要害,深挖那些烧脑又实用的复杂查询案例。
一、QueryCondition 极简指南
QueryCondition 简单说就是装着查询关键要素的 “盒子”。field 指明数据源里要查的字段,像数据库里的 “age” 找特定岁数人群。operator 从丰富枚举挑,EQ 精准配对,数值符管大小,集合符理成员,还有逻辑大咖 MUST 等编排复合规则。operand 跟着 operator 变,单个值或值集合按需上场。isComposite 标记是否复合,有它在,就知道这条件不简单。
二、操作符全解析
(一)EQ(精确匹配)操作符:精准狙击枪
EQ 操作符堪称精准打击的典范,当你决心在茫茫数据海洋中精准定位某一特定值的记录时,它就是你的不二之选。
在图书馆藏书系统里,若要迅速找出 ISBN 号为 “9787568900123” 的那本珍藏书籍
QueryCondition bookCondition = QueryConditionBuilders.create(OperatorEnum.EQ, "isbn", "9787568900123");
(二)GT(大于)与 LT(小于)操作符:数值界的标尺
在学生成绩管理场景中,想快速揪出数学成绩高于 85 分的学霸苗子?
QueryCondition mathScoreCondition = QueryConditionBuilders.create(OperatorEnum.GT, "math_score", 85);
若是要排查语文成绩低于 70 分、急需辅导的同学,把 GT 换成 LT 就行,轻松筛出数值区间两端的数据,为针对性教学策略提供依据。
(三)GTE(大于等于)与 LTE(小于等于)操作符:边界包容大师
以电商商品筛选为例,当你打算盘点价格大于等于 80 元的优质商品时
QueryCondition priceCondition = QueryConditionBuilders.create(OperatorEnum.GTE, "price", 80);
(四)IN 与 NOT_IN 操作符:集合筛选利器
设想在校园社团成员管理系统里,要一次性找出加入了 “文学社”“绘画社” 的多才多艺学生
QueryCondition clubCondition = QueryConditionBuilders.create(OperatorEnum.IN, "club", List.of("文学社", "绘画社"));
NOT_IN 则是反向排除神器,比如排除掉已毕业的学生记录,精准管理集合成员关系。
(五)RANGE 操作符:范围界定艺术家
在气象数据查询时,若要梳理出过去一个月(假设起始日期 startDate 和结束日期 endDate 已妥善准备)内温度在 20 - 30 摄氏度之间的天气记录
QueryCondition temperatureCondition = QueryConditionBuilders.create(OperatorEnum.RANGE, "temperature", new Object[]{20, true, 30, true});
三、迈向逻辑组合条件:构建复杂框架
当简单操作符单打独斗无法满足业务的刁钻需求时,逻辑组合条件带着 MUST、MUST_NOT、SHOULD 闪亮登场,它们如同乐高积木的拼接指令,组合出千变万化的结构。
想象搭建一个高端商务活动参与者筛选机制:目标锁定年龄在 30 - 45 岁(GTE 和 LTE 携手合作)、拥有特定高级会员资质(EQ 精准匹配会员等级)、无不良信用记录(MUST_NOT 结合信用标识字段)且具备丰富行业经验(工作年限大于 8 年,GT 把关)或者近期在行业内发表过重要见解(如论文发表,SHOULD 关联相关标识字段)的精英人士。
// 年龄范围条件
QueryCondition ageLowCondition = QueryConditionBuilders.create(OperatorEnum.GTE, "age", 30);
QueryCondition ageHighCondition = QueryConditionBuilders.create(OperatorEnum.LTE, "age", 45);
List<QueryCondition> ageRange = new ArrayList<>();
ageRange.add(ageLowCondition);
ageRange.add(ageHighCondition);
// 会员资质条件
QueryCondition memberLevelCondition = QueryConditionBuilders.create(OperatorEnum.EQ, "member_level", "Platinum");
// 信用排除条件
QueryCondition creditCondition = QueryConditionBuilders.create(OperatorEnum.MUST_NOT, "has_bad_credit", true);
// 工作年限条件
QueryCondition workYearsCondition = QueryConditionBuilders.create(OperatorEnum.GT, "work_years", 8);
List<QueryCondition> innerShouldInsight = new ArrayList<>();
// 行业见解发表条件,假设字段表示近半年是否有发表
QueryCondition publicationCondition = QueryConditionBuilders.create(OperatorEnum.EQ, "has_recent_publication", true);
innerShouldInsight.add(publicationCondition);
QueryCondition innerShould = QueryConditionBuilders.create(OperatorEnum.SHOULD, null, innerShouldInsight);
List<QueryCondition> outerMustConditions = new ArrayList<>();
outerMustConditions.addAll(ageRange);
outerMustConditions.add(memberLevelCondition);
outerMustConditions.add(creditCondition);
outerMustConditions.add(workYearsCondition);
outerMustConditions.add(innerShould);
BoolQueryBuilder userQuery = queryBuilderFactory.buildBoolQuery(outerMustConditions);
这里巧妙融合基础条件,借逻辑组合操作符构建起初步复杂关联,为精准定位目标用户架起桥梁。
四、多层嵌套查询实战:巅峰对决
步入大型金融服务平台的核心业务场景,需筛选出优质潜在大客户。要求客户资产规模庞大(近一年资产增长超 30%,假设有计算函数 getAssetGrowth,且当前资产总额大于 1000 万,MUST 嵌套复合条件)、风险偏好稳健(投资组合风险系数小于 0.3,LT 关联)、近期无重大金融违规记录(MUST_NOT 结合违规标识字段),同时满足以下条件之一:一是在多个热门金融产品领域(如股票、基金、债券,IN 搭配 SHOULD 深度嵌套)均有涉足且交易活跃(过去一个季度交易次数大于 20 次,GT 把关);二是与平台长期合作(合作年限大于 5 年,GT 衡量)且信用评级极高(评级大于等于 4 星,GTE 界定)。
// 资产增长及规模条件
double growth = getAssetGrowth(clientId, "last_year");
QueryCondition growthCondition = QueryConditionBuilders.create(OperatorEnum.GT, "asset_growth", 30.0);
QueryCondition assetScaleCondition = QueryConditionBuilders.create(OperatorEnum.GT, "total_assets", 10000000);
List<QueryCondition> innerMustAssets = new ArrayList<>();
innerMustAssets.add(growthCondition);
innerMustAssets.add(assetScaleCondition);
QueryCondition innerMust = QueryConditionBuilders.create(OperatorEnum.MUST, null, innerMustAssets);
// 风险偏好条件
QueryCondition riskCondition = QueryConditionBuilders.create(OperatorEnum.LT, "risk_coefficient", 0.3);
// 违规排除条件
QueryCondition violationCondition = QueryConditionBuilders.create(OperatorEnum.MUST_NOT, "has_major_violation", true);
// 热门产品交易活跃度条件
List<String> hotProducts = List.of("股票", "基金", "债券");
List<QueryCondition> innerShouldProducts = new ArrayList<>();
for (String product : hotProducts) {
QueryCondition productCondition = QueryConditionBuilders.create(OperatorEnum.EQ, "has_active_trading_in", product);
innerShouldProducts.add(productCondition);
}
QueryCondition innerShouldProduct = QueryConditionBuilders.create(OperatorEnum.SHOULD, null, innerShouldProducts);
QueryCondition tradingFrequencyCondition = QueryConditionBuilders.create(OperatorEnum.GT, "trading_frequency_last_quarter", 20);
List<QueryCondition> innerShouldTrading = new ArrayList<>();
innerShouldTrading.add(innerShouldProduct);
innerShouldTrading.add(tradingFrequencyCondition);
// 长期合作及信用条件
QueryCondition cooperationCondition = QueryConditionBuilders.create(OperatorEnum.GT, "cooperation_years", 5);
QueryCondition creditRatingCondition = QueryConditionBuilders.create(OperatorEnum.GTE, "credit_rating", 4);
List<QueryCondition> innerShouldCredit = new ArrayList<>();
innerShouldCredit.add(cooperationCondition);
innerShouldCredit.add(creditRatingCondition);
QueryCondition outerShould = QueryConditionBuilders.create(OperatorEnum.SHOULD, null, List.of(innerShouldTrading, innerShouldCredit));
List<QueryCondition> outerMustConditions = new ArrayList<>();
outerMustConditions.add(innerMust);
outerMustConditions.add(riskCondition);
outerMustConditions.add(violationCondition);
outerMustConditions.add(outerShould);
BoolQueryBuilder clientQuery = queryBuilderFactory.buildBoolQuery(outerMustConditions);
此例层层嵌套,环环相扣,从资产到风险,从合规到业务多元性,全方位编织筛选大网,精准锁定潜在大客户。MUST 内部嵌套复合资产条件,SHOULD 分支里既有复杂产品交易逻辑,又有合作信用考量,展现 QueryCondition 在极端复杂场景下披荆斩棘的强大实力,为金融平台精准营销、资源配置提供坚如磐石的数据支撑