私は現在、いくつかのデータを取得するためのelasticsearch要求を行っています。私はJson形式で正しい要求を書くことに成功しました。その後、私はこれをJavaに翻訳しようとしました。しかし、JavaがESに送信する要求を印刷すると、両方の要求が同じではなく、実現することができません。ここでなぜ私のjava elasticsearchリクエスト翻訳は有効ではありませんか?
は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" : [ ]
}
}
}
}
}
}
}
そして最後にJavaコードを要求...良いデータを返しません生成しました間違ったjsonリクエストを生成する:
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());
まず、「サイズ」を削除する必要があります:10 Javaが生成する "from" ...そして、フィルタを追加しなければならない。私はこれをしましたが、それは決して追加されません。 私のJavaコードで何が間違っているのか、なぜフィルタは最終的なJsonに表示されないのでしょうか?
ありがとうございます。
「size」と「from」をなぜ削除したいのですか? ESは自動的に ":"から "":0、 "size":10'と同等のデフォルトを自動的に使用します – ruhungry
どのESのバージョンを使用していますか? – Val