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

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 在极端复杂场景下披荆斩棘的强大实力,为金融平台精准营销、资源配置提供坚如磐石的数据支撑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值