Как написать многоуровневую агрегацию вместе с запросом сортировки с использованиемasticsearch java api - PullRequest
0 голосов
/ 01 мая 2020

Каким-то образом мне удалось написать запрос 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);
...