Commit c286b52f authored by hcing's avatar hcing

feat:统计服务,大屏综合统计查询接口-人员相关

parent 4dcd9ab2
......@@ -23,7 +23,9 @@ public enum UnitTypeEnum {
azgzwxdw("安装改造维修单位", "1234", "license"),
zzdw("制造单位", "1236", "license"),
sjdw("设计单位", "1235", "license"),
grzt("个人主体", "6599", "use");
grzt("个人主体", "6599", "use"),
jyjg("检验机构", "1233-1", "license"),
jcjg("检测机构", "1233-2", "license");
private String name;
private String code;
......
......@@ -261,182 +261,13 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
JSONObject filterParams = null;
if (!ObjectUtils.isEmpty(filter.get("filterParams"))) {
filterParams = JSONObject.parseObject(JSONObject.toJSONString(filter.get("filterParams")));
String filterType = filter.getString("filterType");
deleteUnitCategory(filterParams);
//快捷筛选和自定义筛选解析筛选规则不一致
if (filterType.equals("advanced")) {
filterParams.forEach((k, v) -> {
if (v instanceof JSONArray) {
if (!((JSONArray) v).contains("all") && ((JSONArray) v).size() > 0) {
String field = k;
if (k.equals("newPost") || k.equals("subPost") || k.equals("equipType")) {
DynamicQueryBuilder dynamicQueryBuilder = new DynamicQueryBuilder();
EnhancedDynamicQueryBuilder enhancedDynamicQueryBuilder = new EnhancedDynamicQueryBuilder();
((JSONArray) v).forEach(item -> enhancedDynamicQueryBuilder.add(QueryBuilders.wildcardQuery(field, "*" + item + "*"), or));
dynamicQueryBuilder.and(enhancedDynamicQueryBuilder.build().minimumShouldMatch(1));
boolMust.must(dynamicQueryBuilder.build());
} else if (k.equals("unitType")) {
DynamicQueryBuilder dynamicQueryBuilder = new DynamicQueryBuilder();
EnhancedDynamicQueryBuilder enhancedDynamicQueryBuilder = new EnhancedDynamicQueryBuilder();
((JSONArray) v).forEach(item ->
enhancedDynamicQueryBuilder.add(QueryBuilders.wildcardQuery(field + ".keyword", "*" + item + "*"), or));
dynamicQueryBuilder.and(enhancedDynamicQueryBuilder.build().minimumShouldMatch(1));
boolMust.must(dynamicQueryBuilder.build());
} else if (k.equals("education")) {
TermsQueryBuilder termsQuery = QueryBuilders.termsQuery(field, (JSONArray) v);
boolMust.must(termsQuery);
} else if (k.equals("certNo") || k.equals("expiryDate") || k.equals("permissionLevel") || k.equals("certType") || k.equals("jobItem") || k.equals("permissionItem")) {
String path = "licenses";
((JSONArray) v).forEach(item -> {
String nestedField = path + "." + k;
// 根据证书编号判断有无资质
if (k.equals("certNo")) {
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
path,
existsQuery(nestedField),
ScoreMode.None
);
// 以下人员类型有资质要求
// 人员类型(newPost):检验人员:66151、检测人员:66152、作业人员:6552、检查人员:6763
// 人员子类型(subPost): 持证人员:6713、持证人员(P):6764、持证人员(R2):6765
if (item.equals("1")) {
boolMust.must(nestedQuery);
} else if (item.equals("0")) {
// 无资质
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery()
.should(QueryBuilders.wildcardQuery("newPost", "*66151*"))
.should(QueryBuilders.wildcardQuery("newPost", "*66152*"))
.should(QueryBuilders.wildcardQuery("newPost", "*6552*"))
.should(QueryBuilders.wildcardQuery("newPost", "*6763*"))
.should(QueryBuilders.wildcardQuery("subPost", "*6713*"))
.should(QueryBuilders.wildcardQuery("subPost", "*6764*"))
.should(QueryBuilders.wildcardQuery("subPost", "*6765*"))
.minimumShouldMatch(1);
boolMust.must(queryBuilder);
boolMust.mustNot(nestedQuery);
} else {
// 无资质要求
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery()
.mustNot(QueryBuilders.wildcardQuery("newPost", "*66151*"))
.mustNot(QueryBuilders.wildcardQuery("newPost", "*66152*"))
.mustNot(QueryBuilders.wildcardQuery("newPost", "*6552*"))
.mustNot(QueryBuilders.wildcardQuery("newPost", "*6763*"))
.mustNot(QueryBuilders.wildcardQuery("subPost", "*6713*"))
.mustNot(QueryBuilders.wildcardQuery("subPost", "*6764*"))
.mustNot(QueryBuilders.wildcardQuery("subPost", "*6765*"));
boolMust.must(queryBuilder);
}
} else if (k.equals("expiryDate")) {
EnhancedDynamicQueryBuilder enhancedDynamicQueryBuilder = new EnhancedDynamicQueryBuilder();
if (item.equals("overdue")) {
// 超期:小于当前日期
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery(nestedField).lt(LocalDate.now().format(formatter))),
ScoreMode.None
);
enhancedDynamicQueryBuilder.add(nestedQuery, or);
boolMust.must(enhancedDynamicQueryBuilder.build());
} else if (item.equals("near")) {
// 临期:小于等于当前日期加上30天
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery(nestedField).lte(LocalDate.now().plusDays(30).format(formatter)).gte(LocalDate.now().format(formatter))),
ScoreMode.None
);
enhancedDynamicQueryBuilder.add(nestedQuery, or);
boolMust.must(enhancedDynamicQueryBuilder.build());
} else if (item.equals("normal")) {
// 正常:大于当前日期加上30天
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery(nestedField).gt(LocalDate.now().plusDays(30).format(formatter))),
ScoreMode.None
);
enhancedDynamicQueryBuilder.add(nestedQuery, or);
boolMust.must(enhancedDynamicQueryBuilder.build());
} else if (item.equals("none")) {
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.boolQuery().must(QueryBuilders.existsQuery(nestedField)),
ScoreMode.None
);
enhancedDynamicQueryBuilder.add(nestedQuery, or);
boolMust.must(enhancedDynamicQueryBuilder.build());
}
} else if (k.equals("certType") || k.equals("permissionLevel")) {
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.boolQuery().must(QueryBuilders.termsQuery(nestedField, (JSONArray) v)),
ScoreMode.None
);
boolMust.must(nestedQuery);
} else {
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.boolQuery().must(QueryBuilders.wildcardQuery(nestedField, "*" + item + "*")),
ScoreMode.None
);
boolMust.should(nestedQuery);
}
});
} else if (k.equals("issueDate")) {
JSONArray issueDates = (JSONArray) v;
String startDate = DateUtils.convertDateToString(issueDates.getDate(0), DateUtils.DATE_PATTERN);
String endDate = DateUtils.convertDateToString(issueDates.getDate(1), DateUtils.DATE_PATTERN);
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
"licenses",
QueryBuilders.rangeQuery("licenses." + k).gte(startDate).lte(endDate),
ScoreMode.None
);
boolMust.filter(nestedQuery);
}
}
} else if (v instanceof String) {
if (k.equals("fuzzyInput")) {
String fuzzyValue = String.valueOf(v);
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
queryBuilder.should(QueryBuilders.wildcardQuery("name", "*" + fuzzyValue + "*"));
queryBuilder.should(QueryBuilders.matchQuery("postName", fuzzyValue));
queryBuilder.should(QueryBuilders.matchQuery("subPostName", fuzzyValue));
queryBuilder.should(QueryBuilders.wildcardQuery("unitName", "*" + fuzzyValue + "*"));
queryBuilder.should(QueryBuilders.wildcardQuery("equipCategoryName", "*" + fuzzyValue + "*"));
queryBuilder.should(QueryBuilders.wildcardQuery("superviseOrgName", "*" + fuzzyValue + "*"));
queryBuilder.should(QueryBuilders.wildcardQuery("address", "*" + fuzzyValue + "*"));
queryBuilder.minimumShouldMatch(1);
boolMust.must(queryBuilder);
} else if (k.equals("unitCategory")) {
if (!"".equals(v) && !ObjectUtils.isEmpty(v) && !"all".equals(v)) {
String category = v.toString();
JSONArray unitTypeByType = UnitTypeNewEnum.getUnitTypeByType(category);
List<String> list = unitTypeByType.stream().map(e -> JSONObject.parseObject(JSONObject.toJSONString(e)).get("value").toString()).collect(Collectors.toList());
list.forEach(item -> boolMust.should(QueryBuilders.wildcardQuery("unitType.keyword", "*" + item + "*")).minimumShouldMatch(1));
}
}
}
});
} else {
JSONArray leftGroup = filterParams.getJSONArray("group1");
JSONArray rightGroup = filterParams.getJSONArray("group2");
Boolean isOrGroup = or.equals(filterParams.getString("groupAndOr")) ? Boolean.TRUE : Boolean.FALSE;
handleAdvancedFilter(boolMust, leftGroup, rightGroup, isOrGroup);
}
}
// 排序
if (!ObjectUtils.isEmpty(filter.get("sort"))) {
JSONObject sort = JSONObject.parseObject(JSONObject.toJSONString(filter.get("sort")));
String field = sort.getString("field");
if (field.equals("subPostName")) {
field = "subPost";
} else if (field.equals("postName")) {
field = "newPost";
} else if (field.equals("superviseOrgName")) {
field = "superviseOrgCode";
}
builder.sort(field, sort.getString("order").equals("desc") ? SortOrder.DESC : SortOrder.ASC);
String filterType = "advanced";
// 组装人员过滤条件
this.getPersonBoolQueryBuilder(filterParams, boolMust, filterType);
}
// 组装人员排序条件
this.getPersonBoolQuerySort(filter, builder);
builder.query(boolMust);
builder.from((current - 1) * size);
builder.size(size);
......@@ -543,6 +374,192 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
return result;
}
/**
* 组装人员过滤条件
*/
private void getPersonBoolQueryBuilder(JSONObject filterParams, BoolQueryBuilder boolMust, String filterType) {
deleteUnitCategory(filterParams);
// 快捷筛选和自定义筛选解析筛选规则不一致
if (filterType.equals("advanced")) {
filterParams.forEach((k, v) -> {
if (v instanceof JSONArray) {
if (!((JSONArray) v).contains("all") && ((JSONArray) v).size() > 0) {
String field = k;
if (k.equals("newPost") || k.equals("subPost") || k.equals("equipType")) {
DynamicQueryBuilder dynamicQueryBuilder = new DynamicQueryBuilder();
EnhancedDynamicQueryBuilder enhancedDynamicQueryBuilder = new EnhancedDynamicQueryBuilder();
((JSONArray) v).forEach(item -> enhancedDynamicQueryBuilder.add(QueryBuilders.wildcardQuery(field, "*" + item + "*"), or));
dynamicQueryBuilder.and(enhancedDynamicQueryBuilder.build().minimumShouldMatch(1));
boolMust.must(dynamicQueryBuilder.build());
} else if (k.equals("unitType")) {
DynamicQueryBuilder dynamicQueryBuilder = new DynamicQueryBuilder();
EnhancedDynamicQueryBuilder enhancedDynamicQueryBuilder = new EnhancedDynamicQueryBuilder();
((JSONArray) v).forEach(item ->
enhancedDynamicQueryBuilder.add(QueryBuilders.wildcardQuery(field + ".keyword", "*" + item + "*"), or));
dynamicQueryBuilder.and(enhancedDynamicQueryBuilder.build().minimumShouldMatch(1));
boolMust.must(dynamicQueryBuilder.build());
} else if (k.equals("education")) {
TermsQueryBuilder termsQuery = QueryBuilders.termsQuery(field, (JSONArray) v);
boolMust.must(termsQuery);
} else if (k.equals("certNo") || k.equals("expiryDate") || k.equals("permissionLevel") || k.equals("certType") || k.equals("jobItem") || k.equals("permissionItem")) {
String path = "licenses";
((JSONArray) v).forEach(item -> {
String nestedField = path + "." + k;
// 根据证书编号判断有无资质
if (k.equals("certNo")) {
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
path,
existsQuery(nestedField),
ScoreMode.None
);
// 以下人员类型有资质要求
// 人员类型(newPost):检验人员:66151、检测人员:66152、作业人员:6552、检查人员:6763
// 人员子类型(subPost): 持证人员:6713、持证人员(P):6764、持证人员(R2):6765
if (item.equals("1")) {
boolMust.must(nestedQuery);
} else if (item.equals("0")) {
// 无资质
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery()
.should(QueryBuilders.wildcardQuery("newPost", "*66151*"))
.should(QueryBuilders.wildcardQuery("newPost", "*66152*"))
.should(QueryBuilders.wildcardQuery("newPost", "*6552*"))
.should(QueryBuilders.wildcardQuery("newPost", "*6763*"))
.should(QueryBuilders.wildcardQuery("subPost", "*6713*"))
.should(QueryBuilders.wildcardQuery("subPost", "*6764*"))
.should(QueryBuilders.wildcardQuery("subPost", "*6765*"))
.minimumShouldMatch(1);
boolMust.must(queryBuilder);
boolMust.mustNot(nestedQuery);
} else {
// 无资质要求
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery()
.mustNot(QueryBuilders.wildcardQuery("newPost", "*66151*"))
.mustNot(QueryBuilders.wildcardQuery("newPost", "*66152*"))
.mustNot(QueryBuilders.wildcardQuery("newPost", "*6552*"))
.mustNot(QueryBuilders.wildcardQuery("newPost", "*6763*"))
.mustNot(QueryBuilders.wildcardQuery("subPost", "*6713*"))
.mustNot(QueryBuilders.wildcardQuery("subPost", "*6764*"))
.mustNot(QueryBuilders.wildcardQuery("subPost", "*6765*"));
boolMust.must(queryBuilder);
}
} else if (k.equals("expiryDate")) {
EnhancedDynamicQueryBuilder enhancedDynamicQueryBuilder = new EnhancedDynamicQueryBuilder();
if (item.equals("overdue")) {
// 超期:小于当前日期
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery(nestedField).lt(LocalDate.now().format(formatter))),
ScoreMode.None
);
enhancedDynamicQueryBuilder.add(nestedQuery, or);
boolMust.must(enhancedDynamicQueryBuilder.build());
} else if (item.equals("near")) {
// 临期:小于等于当前日期加上30天
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery(nestedField).lte(LocalDate.now().plusDays(30).format(formatter)).gte(LocalDate.now().format(formatter))),
ScoreMode.None
);
enhancedDynamicQueryBuilder.add(nestedQuery, or);
boolMust.must(enhancedDynamicQueryBuilder.build());
} else if (item.equals("normal")) {
// 正常:大于当前日期加上30天
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery(nestedField).gt(LocalDate.now().plusDays(30).format(formatter))),
ScoreMode.None
);
enhancedDynamicQueryBuilder.add(nestedQuery, or);
boolMust.must(enhancedDynamicQueryBuilder.build());
} else if (item.equals("none")) {
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.boolQuery().must(existsQuery(nestedField)),
ScoreMode.None
);
enhancedDynamicQueryBuilder.add(nestedQuery, or);
boolMust.must(enhancedDynamicQueryBuilder.build());
}
} else if (k.equals("certType") || k.equals("permissionLevel")) {
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.boolQuery().must(QueryBuilders.termsQuery(nestedField, (JSONArray) v)),
ScoreMode.None
);
boolMust.must(nestedQuery);
} else {
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.boolQuery().must(QueryBuilders.wildcardQuery(nestedField, "*" + item + "*")),
ScoreMode.None
);
boolMust.should(nestedQuery);
}
});
} else if (k.equals("issueDate")) {
JSONArray issueDates = (JSONArray) v;
String startDate = DateUtils.convertDateToString(issueDates.getDate(0), DateUtils.DATE_PATTERN);
String endDate = DateUtils.convertDateToString(issueDates.getDate(1), DateUtils.DATE_PATTERN);
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
"licenses",
QueryBuilders.rangeQuery("licenses." + k).gte(startDate).lte(endDate),
ScoreMode.None
);
boolMust.filter(nestedQuery);
}
}
} else if (v instanceof String) {
if (k.equals("fuzzyInput")) {
String fuzzyValue = String.valueOf(v);
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
queryBuilder.should(QueryBuilders.wildcardQuery("name", "*" + fuzzyValue + "*"));
queryBuilder.should(QueryBuilders.matchQuery("postName", fuzzyValue));
queryBuilder.should(QueryBuilders.matchQuery("subPostName", fuzzyValue));
queryBuilder.should(QueryBuilders.wildcardQuery("unitName", "*" + fuzzyValue + "*"));
queryBuilder.should(QueryBuilders.wildcardQuery("equipCategoryName", "*" + fuzzyValue + "*"));
queryBuilder.should(QueryBuilders.wildcardQuery("superviseOrgName", "*" + fuzzyValue + "*"));
queryBuilder.should(QueryBuilders.wildcardQuery("address", "*" + fuzzyValue + "*"));
queryBuilder.minimumShouldMatch(1);
boolMust.must(queryBuilder);
} else if (k.equals("unitCategory")) {
if (!"".equals(v) && !ObjectUtils.isEmpty(v) && !"all".equals(v)) {
String category = v.toString();
JSONArray unitTypeByType = UnitTypeNewEnum.getUnitTypeByType(category);
List<String> list = unitTypeByType.stream().map(e -> JSONObject.parseObject(JSONObject.toJSONString(e)).get("value").toString()).collect(Collectors.toList());
list.forEach(item -> boolMust.should(QueryBuilders.wildcardQuery("unitType.keyword", "*" + item + "*")).minimumShouldMatch(1));
}
}
}
});
} else {
JSONArray leftGroup = filterParams.getJSONArray("group1");
JSONArray rightGroup = filterParams.getJSONArray("group2");
Boolean isOrGroup = or.equals(filterParams.getString("groupAndOr")) ? Boolean.TRUE : Boolean.FALSE;
handleAdvancedFilter(boolMust, leftGroup, rightGroup, isOrGroup);
}
}
/**
* 组装人员排序
*/
private void getPersonBoolQuerySort(JSONObject filter, SearchSourceBuilder builder) {
// 排序
if (!ObjectUtils.isEmpty(filter.get("sort"))) {
JSONObject sort = JSONObject.parseObject(JSONObject.toJSONString(filter.get("sort")));
String field = sort.getString("field");
if (field.equals("subPostName")) {
field = "subPost";
} else if (field.equals("postName")) {
field = "newPost";
} else if (field.equals("superviseOrgName")) {
field = "superviseOrgCode";
}
builder.sort(field, sort.getString("order").equals("desc") ? SortOrder.DESC : SortOrder.ASC);
}
}
private JSONObject queryCompanyPage(JSONObject filter, Page<JSONObject> page, Integer current, Integer size) {
JSONObject result = new JSONObject();
......@@ -2668,8 +2685,75 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
}
private List<Map<String, Object>> queryDpPersonStatistics(JSONObject filter, SearchRequest request, SearchSourceBuilder builder, BoolQueryBuilder boolMust, Map<String, Object> tabTotalMap) {
return null;
private List<Map<String, Object>> queryDpPersonStatistics(JSONObject filter, SearchRequest request, SearchSourceBuilder builder,
BoolQueryBuilder boolMust, Map<String, Object> tabTotalMap) {
JSONObject filterParams = JSONObject.parseObject(JSONObject.toJSONString(filter.get("filterParams")));
String filterType = "advanced";
// 组装人员过滤条件
this.getPersonBoolQueryBuilder(filterParams, boolMust, filterType);
// 计算总数
long personTotal = this.queryDpPersonStatisticsTotal(boolMust);
// 聚合查询
builder.size(0);// 不返回任何文档,只返回聚合结果
String aggName = "unit_types_split";
QueryBuilderUtils.buildSplitFieldAggCondition(builder, "unitType.keyword", "#", aggName);
builder.query(boolMust);
request.source(builder);
Map<String, Object> result = new HashMap<>();
try {
SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);
// 解析聚合结果
Terms unitTypesTerms = searchResponse.getAggregations().get(aggName);
if (unitTypesTerms != null) {
for (Terms.Bucket bucket : unitTypesTerms.getBuckets()) {
if (bucket.getKeyAsString().equals(UnitTypeEnum.sydw.getName())) {
result.put("sydw", bucket.getDocCount());
}
if (bucket.getKeyAsString().equals(UnitTypeEnum.grzt.getName())) {
result.put("grzt", bucket.getDocCount());
}
if (bucket.getKeyAsString().equals(UnitTypeEnum.sjdw.getName())) {
result.put("sjdw", bucket.getDocCount());
}
if (bucket.getKeyAsString().equals(UnitTypeEnum.zzdw.getName())) {
result.put("zzdw", bucket.getDocCount());
}
if (bucket.getKeyAsString().equals(UnitTypeEnum.azgzwxdw.getName())) {
result.put("azgzwxdw", bucket.getDocCount());
}
if (bucket.getKeyAsString().equals(UnitTypeEnum.czdw.getName())) {
result.put("czdw", bucket.getDocCount());
}
if (bucket.getKeyAsString().equals(UnitTypeEnum.jyjg.getName())) {
result.put("jyjg", bucket.getDocCount());
}
if (bucket.getKeyAsString().equals(UnitTypeEnum.jcjg.getName())) {
result.put("jcjg", bucket.getDocCount());
}
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
// 汇总总数
tabTotalMap.put(StatisticalAnalysisEnum.person.getCode(), personTotal);
return Collections.singletonList(result);
}
private long queryDpPersonStatisticsTotal(BoolQueryBuilder boolMust) {
CountRequest countRequest = new CountRequest();
countRequest.indices(StatisticalAnalysisEnum.person.getKey());
countRequest.query(boolMust);
CountResponse countResponse;
try {
countResponse = restHighLevelClient.count(countRequest, RequestOptions.DEFAULT);
} catch (Exception exception) {
throw new RuntimeException(exception);
}
return ObjectUtils.isEmpty(countResponse) ? 0 : countResponse.getCount();
}
private List<Map<String, Object>> queryDpCompanyStatistics(JSONObject filter, SearchRequest request, SearchSourceBuilder builder, BoolQueryBuilder boolMust, Map<String, Object> tabTotalMap) {
......
......@@ -2,6 +2,12 @@ package com.yeejoin.amos.boot.module.statistcs.biz.utils;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.script.Script;
import org.elasticsearch.script.ScriptType;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import java.util.Collections;
public class QueryBuilderUtils {
// 复制BoolQueryBuilder
......@@ -29,4 +35,25 @@ public class QueryBuilderUtils {
return copy;
}
/**
* 组装分割符字段的聚合查询
*
* @param searchSourceBuilder es查询构造器
* @param field 需要查询的字段,如:unitType.keyword
* @param spiltSymbol 分割符号,如:#
* @param aggName 聚合名称,根据此名称从查询结果获取数据,如:Terms unitTypesTerms = searchResponse.getAggregations().get(aggName)
*/
public static void buildSplitFieldAggCondition(SearchSourceBuilder searchSourceBuilder, String field, String spiltSymbol, String aggName) {
// Painless 脚本内容
String scriptSource = "if (doc['" + field + "'].size() > 0) {" +
" String value = doc['" + field + "'].value;" +
" if (value != null && !value.isEmpty()) {" +
" return value.splitOnToken('" + spiltSymbol + "');" +
" }" +
"}" +
"return [];";
Script script = new Script(ScriptType.INLINE, "painless", scriptSource, Collections.emptyMap());
searchSourceBuilder.aggregation(AggregationBuilders.terms(aggName).script(script));
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment