elasticsearch collapse查询计数
·
1. cardinality计数:
虽然快,但计数不准,原因自行百度
2.自定义脚本计数:
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.from(esPageRange.getFrom());
sourceBuilder.size(esPageRange.getSize());
sourceBuilder.collapse(new CollapseBuilder(collapseField));
sourceBuilder.aggregation(this.scriptedMetricAggregation("termsCount", collapseField));
sourceBuilder.query(queryBuilder);
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices(indexArray);
searchRequest.source(sourceBuilder);
//索引不存在时,不报错
searchRequest.indicesOptions(IndicesOptions.LENIENT_EXPAND_OPEN);
List<T> resultList = new ArrayList<>();
long total = 0L;
SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
if (response.getHits().getHits() != null) {
for (SearchHit hit : response.getHits().getHits()) {
resultList.add(transHitFunction.apply(hit));
}
}
if (response.getAggregations() != null){
Aggregations aggregations = response.getAggregations();
ParsedScriptedMetric scriptedMetric = aggregations.get("termsCount");
if (scriptedMetric != null && scriptedMetric.aggregation() != null){
Integer value = (Integer)scriptedMetric.aggregation();
total = value.longValue();
}
}
3.脚本聚合代码:
public ScriptedMetricAggregationBuilder scriptedMetricAggregation(String aggregationName, String fieldName){
String initScript = "state.numas=new HashSet();";
String mapScript = "def array = doc['"+fieldName+"'];\n" +
" if(array.length>=1){\n" +
" for (def id : array) {\n" +
" state.numas.add(id);\n" +
" }\n" +
" }";
String combineScript = "return state.numas";
String reduceScript = "def set =new HashSet();\n" +
" for(e in states){\n" +
" if(!Objects.isNull(e)){\n" +
" for(key in e){\n" +
" set.add(key);\n" +
" }\n" +
" }\n" +
" }\n" +
" return set.size();";
ScriptedMetricAggregationBuilder scriptedMetricAggregationBuilder = AggregationBuilders.scriptedMetric(aggregationName);
scriptedMetricAggregationBuilder.initScript(new Script(ScriptType.INLINE, PAINLESS, initScript, Collections.emptyMap()));
scriptedMetricAggregationBuilder.mapScript(new Script(ScriptType.INLINE, PAINLESS, mapScript, Collections.emptyMap()));
scriptedMetricAggregationBuilder.combineScript(new Script(ScriptType.INLINE, PAINLESS, combineScript, Collections.emptyMap()));
scriptedMetricAggregationBuilder.reduceScript(new Script(ScriptType.INLINE, PAINLESS, reduceScript, Collections.emptyMap()));
return scriptedMetricAggregationBuilder;
}
更多推荐
所有评论(0)