【问题标题】:Aggregations in Java client through JSON query - without AggregationBuilder通过 JSON 查询在 Java 客户端中进行聚合 - 没有 AggregationBuilder
【发布时间】:2015-12-25 13:57:02
【问题描述】:

我能够在基于 HTTP 的 JEST 客户端中通过 JSON 查询实现 aggregation 功能,但不能在基于 TCP 的 Java 客户端中实现。

通过JEST 客户端(基于HTTP REST)可以通过查询字符串实现聚合。
JEST 示例代码:

        JestClientFactory factory = new JestClientFactory();
        HttpClientConfig httpClientConfig = new HttpClientConfig
                                    .Builder("http://localhost:9201")
                                    .build();
        factory.setHttpClientConfig(httpClientConfig);
        JestClient client = factory.getObject();

        String queryString ="{\"query\":{\"match_all\": {}},\"aggs\":{\"avg1\":{\"avg\":{\"field\":\"age\"} } }}";

        Search.Builder searchBuilder = new Search.Builder(queryString)
.addIndex("st1index")
    .addType("st1type");  

        SearchResult response = client.execute(searchBuilder.build());

        System.out.println(response.getJsonString());

        client.shutdownClient();

JEST 客户端的打印响应显示聚合结果。


elasticsearch 中使用TCP client,可以通过AggregationBuilder 使用aggregation

当我尝试在TCP 中实现 JSON 查询时,它没有返回聚合结果。

TCP 不支持通过查询字符串进行聚合但支持添加聚合选项有什么原因吗?

TCP Java 客户端示例代码:

已编辑 删除了 queryString 周围的 WrapperQueryBuilder

Settings settings = ImmutableSettings.settingsBuilder()
                .put("cluster.name", "javaEscluster")
                .put("node.name", "arivu").build();
Client client = new TransportClient(settings)
     .addTransportAddress(new InetSocketTransportAddress("localhost", 9303));

String queryString ="{\"match_all\": {},\"aggs\":{\"avg1\":{\"avg\":{\"field\":\"age\"} } }}";

SearchResponse response = client.prepareSearch("st1index").setTypes("st1type").setQuery(queryString).execute().actionGet();

System.out.println("Getresponse-->" +"Index-->"+ response.toString());

//closing node
client.close();
System.out.println("completed");

此代码仅检索搜索结果和空聚合结果数据。

已编辑:

任何解释原因的参考资料都会很棒。

【问题讨论】:

    标签: elasticsearch tcp


    【解决方案1】:

    WrapperQueryBuilder类的主文档中是这样写的:

    一个查询构建器,它允许在给定 JSON 字符串或作为输入提供的二进制数据的情况下构建查询。当您想要使用 Java Builder API 但手头仍有 JSON 查询字符串想要与其他查询构建器结合时,这很有用。

    这里的关键字是query这个词,即你发送到ES_search端点的请求中名为query的部分,即:

    {
        "sort": {
           ...          <--- whatever sorting definition you have goes here
        },
        "_source": {
           ...          <--- whatever source definition you have goes here
        },
        "query": {
           ...          <--- this is the content you can use with WrapperQueryBuilder
        },
        "aggs": {
           ...          <--- whatever aggs definition you have goes here
        }
    }
    

    WrapperQueryBuilder 只会考虑您可以放入 query 部分的任何内容,因此您可以看到不包括聚合,聚合位于请求的另一个顶级部分中。

    因此,在您提供的 JSON 查询字符串中,将仅考虑 match_all,因为这是允许出现在 query 部分中的唯一有效标记,aggs:{...} 部分不是。

    "{\"match_all\": {},\"aggs\":{\"avg1\":{\"avg\":{\"field\":\"age\"} } }}"
         ^                 ^
         |                 |
    this is valid        this is NOT valid
    

    【讨论】:

    • 谢谢.. 但是我不得不在没有 WrapperQueryBuilder 的情况下更新代码,但这个代码放错了位置。很抱歉给您带来不便
    • 请在不使用 WrapperQueryBuilder 的情况下对这个问题提出建议。
    • 根本无法像查询部分那样从字符串构建聚合。
    • --@Val,添加更多细节,在我们的应用程序中,我们交替使用基于 TCP 和 HTTP 的客户端。因为 JEST 客户端支持基于查询的聚合,而 TCP Java 客户端不支持。因此,我需要任何文档化的参考资料来证明 TCP 不支持这一点。
    • 这不是 TCP 与 HTTP 的问题,只是 Elasticsearch Java API 不支持这一点。您的 HTTP 客户端是基于 Jest 的,这是一个提供不同 Java API 的不同项目。
    猜你喜欢
    • 1970-01-01
    • 2013-05-05
    • 2014-09-13
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    相关资源
    最近更新 更多