From 6f151d3ade7106aa7ac0607dc043ada865c5afbc Mon Sep 17 00:00:00 2001 From: zat366 Date: Thu, 21 Aug 2025 19:12:27 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat(=E8=81=9A=E5=90=88=E7=AD=96=E7=95=A5):?= =?UTF-8?q?=20=E4=BC=98=E5=8C=96=20Terms=20Agg=20=E7=9A=84=20limit=20?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 扩展了对子聚合为空情况的处理,增加了对特殊聚合组合的处理 - 引入了对 maxResultRow 的考虑,以确保数据完整性 - 优化了 limit 的设置逻辑,提高了查询结果的准确性 --- .../ly/ckibana/strategy/aggs/TermsAggStrategy.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/ly/ckibana/strategy/aggs/TermsAggStrategy.java b/src/main/java/com/ly/ckibana/strategy/aggs/TermsAggStrategy.java index 96d080f..43d6d36 100644 --- a/src/main/java/com/ly/ckibana/strategy/aggs/TermsAggStrategy.java +++ b/src/main/java/com/ly/ckibana/strategy/aggs/TermsAggStrategy.java @@ -107,10 +107,17 @@ public CkRequest buildCkRequest(CkRequestContext ckRequestContext) { if (getSize() == null) { setSize(10); } - //若子aggs的有额外group by条件,size条件失效 - if (isSubAggGroupByEmpty()) { - result.limit(getSize()); + + // 对于特殊的聚合组合(terms+子terms, range+子terms),应用 ES API 的 size 限制 + // 其他复杂嵌套场景仍使用 maxResultRow 保证数据完整性 + if (isSubAggGroupByEmpty() || isIgnoreSubAggCondition()) { + int actualLimit = getSize(); + if (ckRequestContext.getMaxResultRow() > 0) { + actualLimit = Math.min(getSize(), ckRequestContext.getMaxResultRow()); + } + result.limit(actualLimit); } + return result; } From 98657562031c49eaa098f7f3527bb61e32f510c9 Mon Sep 17 00:00:00 2001 From: zat366 Date: Mon, 25 Aug 2025 15:15:44 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix(range):=20=E4=BF=AE=E5=A4=8D=E8=8C=83?= =?UTF-8?q?=E5=9B=B4=E6=9F=A5=E8=AF=A2=20IP=20=E7=B1=BB=E5=9E=8B=E5=92=8C?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E7=B1=BB=E5=9E=8B=E8=BD=AC=E6=8D=A2=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98-=20=E4=BC=98=E5=8C=96=20IP=20=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E5=88=A4=E6=96=AD=E9=80=BB=E8=BE=91=EF=BC=8C=E4=BC=98?= =?UTF-8?q?=E5=85=88=E4=BD=BF=E7=94=A8=20low=20=E5=80=BC=E5=88=A4=E6=96=AD?= =?UTF-8?q?=EF=BC=8Clow=20=E4=B8=BA=20null=20=E6=97=B6=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=20high=20=E5=80=BC=20-=20=E4=BF=AE=E5=A4=8D=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E8=8C=83=E5=9B=B4=E6=9F=A5=E8=AF=A2=E7=9A=84?= =?UTF-8?q?=E4=B8=8A=E7=95=8C=E6=AF=94=E8=BE=83=E8=BF=90=E7=AE=97=E7=AC=A6?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../clause/converter/QueryStringClauseConverter.java | 2 +- src/main/java/com/ly/ckibana/util/ProxyUtils.java | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/ly/ckibana/strategy/clause/converter/QueryStringClauseConverter.java b/src/main/java/com/ly/ckibana/strategy/clause/converter/QueryStringClauseConverter.java index 554c83e..cfc7004 100644 --- a/src/main/java/com/ly/ckibana/strategy/clause/converter/QueryStringClauseConverter.java +++ b/src/main/java/com/ly/ckibana/strategy/clause/converter/QueryStringClauseConverter.java @@ -111,7 +111,7 @@ private String generateRangeSql() { return String.format(LOGICALOP_RANGE_TEMPLATE_DEFAULT, logicalOp, SqlUtils.getCompareSql(field.getCkName(), includeThreshold ? Constants.Symbol.GTE : Constants.Symbol.GT, from), - SqlUtils.getCompareSql(field.getCkName(), includeThreshold ? Constants.Symbol.LTE : Constants.Symbol.GT, to)); + SqlUtils.getCompareSql(field.getCkName(), includeThreshold ? Constants.Symbol.LTE : Constants.Symbol.LT, to)); } /** diff --git a/src/main/java/com/ly/ckibana/util/ProxyUtils.java b/src/main/java/com/ly/ckibana/util/ProxyUtils.java index 4db0a8c..8734b74 100644 --- a/src/main/java/com/ly/ckibana/util/ProxyUtils.java +++ b/src/main/java/com/ly/ckibana/util/ProxyUtils.java @@ -282,8 +282,11 @@ public static Range getRangeWrappedBySqlFunction(Range orgRange, boolean isTimeF rangeConverted.setHigh(generateTimeFieldSqlWithFormatDateTime64ZoneShangHai(orgRange.getHigh(), ckFieldType)); rangeConverted.setLow(generateTimeFieldSqlWithFormatDateTime64ZoneShangHai(orgRange.getLow(), ckFieldType)); } else { - //ip - IPType ipType = ProxyUtils.getIpType(orgRange.getCkFieldType(), orgRange.getLow().toString()); + //ip - 优先使用low值判断IP类型,如果low为null则使用high值 + IPType ipType = null; + if (orgRange.getLow() != null) { + ipType = ProxyUtils.getIpType(orgRange.getCkFieldType(), orgRange.getLow().toString()); + } if (null != ipType) { rangeConverted.setCkFieldName(SqlUtils.generateIpSql(ckFieldName, ipType, false)); rangeConverted.setHigh(SqlUtils.generateIpSql(orgRange.getHigh(), ipType, true));