0

我是 EL 的新手。我的要求是我需要使用 Spring Boot 通过 Java API 从 ELS 获取数据。我已经编写了搜索查询以及折叠和排序。它工作得很好。但是我正在学习如何在 java spring boot 中重新编写这段代码。你能帮帮我吗?

在我的 ELS 查询下方:

GET /test/_search
{
  "query": {
    "function_score": {
      "query": {
        "constant_score": {
          "filter": {
            "bool": {
              "must": [
                {
              "match" : {
              "job_status" : "SUCCESS"
              }
              },
                {
                  "range": {
                    "input_count": {
                      "gte": 0
                    }
                  }
                },
                {
                  "range": {
                    "output_count": {
                      "gte": 0
                    }
                  }
                },
                {
                  "range": {
                    "@timestamp": {
                      "from" : "20/04/2020",
                     "to" : "26/04/2020",
                      "format" : "dd/MM/yyyy"
                    }
                  }
                },
                {
                  "script": {
                    "script": {
                      "source": "doc['output_count'].value < doc['input_count'].value",
                      "params": {}
                    }
                  }
                }
              ]
            }
          }
        }
      }
    }
  },
   "collapse": {
    "field": "run_id.keyword"
  },
  "sort": [
    {
      "@timestamp": {
        "order": "desc"
      }
    }
  ]
}

这是我的 Java 代码:它工作正常。在这里,我需要您的帮助来添加折叠和排序 API 代码。

    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);

希望我对我的问题很清楚。

4

1 回答 1

1

只需将 SortBuilder 添加到 SearchSourceBuilder:

rowCountMatchSearchSourceBuilder.sort(SortBuilders.fieldSort("@timestamp").order(SortOrder.DESC));

对于“折叠”,它可以像这样工作:

rowCountMatchSearchSourceBuilder.collapse(new CollapseBuilder("run_id.keyword"));
于 2020-05-05T11:32:31.763 回答