当前位置: 首页 > 面试题库 >

通过JSON查询在Java客户端中进行聚合-无需AggregationBuilder

萧渝
2023-03-14
问题内容

我能够aggregation通过JSON基于HTTP的JEST客户端中的查询来实现功能,但不能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客户端的打印响应显示聚合结果。

使用TCP clientelasticsearchaggregation有可能通过AggregationBuilder

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

TCP是否不支持通过查询字符串进行聚合但支持添加聚合选项的任何原因?

TCP Java客户端示例代码:

编辑已 删除WrapperQueryBuilderqueryString周围的内容。

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

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

编辑:

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


问题答案:

WrapperQueryBuilder该类的主要文档中指出:

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

这里的关键字是单词 query ,即在query您发送到ES _search端点的请求中命名的部分,即:

{
    "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


 类似资料:
  • 我在Spring Boot应用程序中使用ElasticSearch高级客户端Java API。我想记录使用高级客户端API构建的查询,以便进行调试。 我的问题是我的应用程序需要什么样的设置。属性文件来打开从我的应用程序生成的JSON查询? 我在应用程序中尝试了以下属性。属性文件。但是,它不会打印使用各种查询生成器生成的JSON查询。

  • 当我使用documentId作为字段路径从Firebase Firestore查询数据时,在Web页面(javascript)和Firebase函数(node.js)中运行脚本时,我会得到不同的行为。 给我一个错误: 错误:{错误:__name__上的筛选器必须是clientreadablestream._emitstatusIfdone(/user_code/node_modules/fireb

  • >[danger] 注意!!! 使用聚合功能时,必须给它一个别名,以便能够从模型中访问它 > 聚合函数的计算,都是排除了 null 值,所以COUNT( id ) 一般推荐用非空的主键来计算 COUNT 计算数量 const { Sequelize } = app; // 查询班级总人数,按照姓名聚合 const ret = await Student.findAll({ attribut

  • 在应用中我们经常会用到一些统计数据,例如当前所有(或者满足某些条件)的用户数、所有用户的最大积分、用户的平均成绩等等,ThinkPHP为这些统计操作提供了一系列的内置方法,包括: 方法 说明 count 统计数量,参数是要统计的字段名(可选) max 获取最大值,参数是要统计的字段名(必须) min 获取最小值,参数是要统计的字段名(必须) avg 获取平均值,参数是要统计的字段名(必须) sum

  • 本文向大家介绍Sequelize中用group by进行分组聚合查询,包括了Sequelize中用group by进行分组聚合查询的使用技巧和注意事项,需要的朋友参考一下 一、SQL与Sequelize中的分组查询 1.1 SQL中的分组查询 SQL查询中,通GROUP BY语名实现分组查询。GROUP BY子句要和聚合函数配合使用才能完成分组查询,在SELECT查询的字段中,如果没有使用聚合函数

  • ElasticsearchJava客户端SearchACK无法解析聚合结果。我在网上看到一些文章,建议添加以键为前缀的聚合类型。我添加了我认为适用于我的用例的内容,例如“sterms#和sum#”,但我无法确定哪种类型适用于主过滤器(在我的情况下键:“匹配”)。我希望桶对象被填充,但尽管elasticsearch的响应包含聚合,但它目前仍作为空数组返回。 注:这是为了能够进行单元测试。 Json响