Каким-то образом мне удалось написать запрос ELS, и он работает нормально. То же самое должно вызывать его в Java API. Я хочу создать аналогичный запрос, используя Elasticsearch JAVA API.
Запрос ELS:
GET /test/_search
{
"size": 0,
"query": {
"bool": {
"must": [
{
"match" : {
"job_status" : "SUCCESS"
}
},
{
"range": {
"input_record_count": {
"gte": 0
}
}
},
{
"range": {
"output_record_count": {
"gte": 0
}
}
},
{
"range": {
"@timestamp": {
"from" : "20/04/2020",
"to" : "28/04/2020",
"format" : "dd/MM/yyyy"
}
}
},
{
"script": {
"script": {
"source": "doc['output_record_count'].value < doc['input_record_count'].value",
"params": {}
}
}
}
]
}
},
"aggs": {
"distinct_runid": {
"terms": {
"field": "run_id.keyword"
},
"aggs": {
"distinct_jobnames": {
"terms": {
"field": "job_name.keyword"
},
"aggs": {
"docs": {
"top_hits": {
"size": 1,
"sort": [{"@timestamp":"desc"}]
}
}
}
}
}
}
}
}
Ниже приведен мой код java без агрегирования. Работает нормально. Но я застрял при написании запроса агрегации и субагрегации в java.
MultiSearchRequest multiRequest = new MultiSearchRequest();
SearchRequest rowCountMatchRequest = new SearchRequest();
SearchSourceBuilder rowCountMatchSearchSourceBuilder = new SearchSourceBuilder();
MultiSearchResponse response = null;
BoolQueryBuilder rowCountMatchQuery = QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("job_status", Constants.SUCCESS))
.must(QueryBuilders.rangeQuery("input_record_count").gte(0))
.must(QueryBuilders.rangeQuery("output_record_count").gte(0))
.must(QueryBuilders.rangeQuery("@timestamp").format("dd/MM/yyyy").gte(fromDate).lte(toDate))
.must(QueryBuilders.scriptQuery(
new Script("doc['output_count'].value >= doc['input_count'].value")));
rowCountMatchSearchSourceBuilder.query(rowCountMatchQuery);
rowCountMatchRequest.indices(stblstreamsetindex);
rowCountMatchRequest.source(rowCountMatchSearchSourceBuilder);
multiRequest.add(rowCountMatchRequest);
response = restHighLevelClient.msearch(multiRequest, RequestOptions.DEFAULT);