我目前正在制作弹性搜索请求来检索一些数据。我成功地以Json格式编写了正确的请求。之后我尝试将这个翻译成Java。但是,当我打印出Java发送给ES的请求时,两个请求都不一样,我没有实现这一点。
这是返回GOOD数据的Json请求:
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"bool": {
"must": [
{ "terms": { "accountId": ["107276450147"] } },
{"range" : {
"date" : {
"lt" : "1480612801000",
"gte" : "1478020801000"
} }
}]
}
}
}
},
"size" : 0,
"aggregations" : {
"field-aggregation" : {
"terms" : {
"field" : "publicationId",
"size" : 2147483647
},
"aggregations" : {
"top-aggregation" : {
"top_hits" : {
"size" : 1,
"_source" : {
"includes" : [ ],
"excludes" : [ ]
}
}
}
}
}
}
}
Java生成的请求......没有返回好的数据..
{
"from" : 0,
"size" : 10,
"aggregations" : {
"field-aggregation" : {
"terms" : {
"field" : "publicationId",
"size" : 2147483647
},
"aggregations" : {
"top-aggregation" : {
"top_hits" : {
"size" : 1,
"_source" : {
"includes" : [ ],
"excludes" : [ ]
}
}
}
}
}
}
}
最后生成错误的json请求的java代码:
TopHitsBuilder top = AggregationBuilders.topHits("top-aggregation")
.setFetchSource(true)
.setSize(1);
TermsBuilder field = AggregationBuilders.terms("field-aggregation")
.field(aggFieldName)
.size(Integer.MAX_VALUE)
.subAggregation(top);
BoolFilterBuilder filterBuilder = FilterBuilders.boolFilter()
.must(FilterBuilders.termsFilter("accountId", Collections.singletonList("107276450147")))
.must(FilterBuilders.rangeFilter("date").gte(1478020801000L).lte(1480612801000L));
NativeSearchQueryBuilder query = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.filteredQuery(QueryBuilders.matchAllQuery(), filterBuilder))
.withIndices("metric")
.withTypes(type)
.addAggregation(field);
return template.query(query.build());
首先,我必须删除“size”:10和Java生成的“from”...之后我必须添加过滤器。我做了这个,但它从未添加.. 你能告诉我的java代码有什么问题吗?为什么过滤器没有出现在最终的Json中?
谢谢你们。
答案 0 :(得分:0)
谢谢你们。我终于解决了这个问题。 java发送了很好的查询,但我在ES java API中看错了地方。尽管如此,我还是将请求类型添加到COUNT中,以避免ES向我发回对我无用的非聚合数据。