NLPchina / elasticsearch-sql

Use SQL to query Elasticsearch
Apache License 2.0
6.99k stars 1.54k forks source link

group by 查询没获取到数据 #1227

Closed FangPengbo closed 12 months ago

FangPengbo commented 12 months ago

使用方式

ActionRequest request = searchDao.explain(sql).explain().request();

原SQL

SELECT /*! TRACK_TOTAL_HITS(true) */ service_id, count(service_id) FROM sw_metrics-sum GROUP BY service_id LIMIT 0, 10

使用explain显示的 dsl如下

String dsl = searchDao.explain(sql).explain().explain()
{
  "from": 0,
  "size": 0,
  "_source": {
    "includes": [
      "service_id",
      "COUNT"
    ],
    "excludes": []
  },
  "stored_fields": "service_id",
  "track_total_hits": 2147483647,
  "aggregations": {
    "service_id": {
      "terms": {
        "field": "service_id",
        "size": 10,
        "shard_size": 5000,
        "min_doc_count": 1,
        "shard_min_doc_count": 0,
        "show_term_doc_count_error": false,
        "order": [
          {
            "_count": "desc"
          },
          {
            "_key": "asc"
          }
        ]
      },
      "aggregations": {
        "COUNT(service_id)": {
          "value_count": {
            "field": "service_id"
          }
        }
      }
    }
  }
}

具体code:

        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                                new HttpHost(hostName, port, scheme)
                        )
                        .setHttpClientConfigCallback(httpClientBuilder -> {
                            httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
                            return httpClientBuilder;
                        })
        );
        ActionRequest request = searchDao.explain(sql).explain().request();
        SearchResponse searchResponse = null;
        try {
            if (request instanceof SearchRequest){
                SearchRequest sRequest = (SearchRequest) request;
                searchResponse = client.search(sRequest, RequestOptions.DEFAULT);
            }else if (request instanceof SearchScrollRequest){
                SearchScrollRequest sRequest = (SearchScrollRequest) request;
                searchResponse = client.scroll(sRequest, RequestOptions.DEFAULT);
            }
        } finally {
            client.close();
        }
        SearchHits hits = searchResponse.getHits();

查询出来的 hits 是空的, 但是查询正常的sql, 和条件查询都没问题. 这个聚合查询就查不出来, 使用方式哪里有问题吗

FangPengbo commented 12 months ago

或者有办法解析SearchResponse吗

FangPengbo commented 12 months ago

解决啦~