我可以在基于HTTP的aggregation
客户端中通过JSON
查询实现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 client
中使用elasticsearch
,aggregation
可以通过AggregationBuilder
。
当我尝试在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");
此代码仅检索搜索结果和空聚合结果数据。
编辑:
任何解释原因的参考资料都会很棒。
答案 0 :(得分:2)
在WrapperQueryBuilder
类的主要文档中,声明:
“查询”构建器,允许在给定JSON字符串或作为输入提供的二进制数据的情况下构建查询。当您想要使用Java Builder API但仍然有想要与其他查询构建器组合的JSON查询字符串时,这非常有用。
此处的关键字是查询,即您发送到ES query
端点的请求中名为_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
部分中显示的有效令牌,{ {1}}部分不是。
aggs:{...}