2016-12-01 5 views
1

私は現在、いくつかのデータを取得するための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に表示されないのでしょうか?

ありがとうございます。

+0

「size」と「from」をなぜ削除したいのですか? ESは自動的に ":"から "":0、 "size":10'と同等のデフォルトを自動的に使用します – ruhungry

+0

どのESのバージョンを使用していますか? – Val

答えて

0

ありがとうございます。私は最終的に問題を管理します。 Javaは良いクエリを送信しましたが、私はES Java APIの間違った場所を見ていました。それにもかかわらず、ESがCOUNTにリクエストタイプを追加して、ESが私に役に立たない集計されていないデータを返信しないようにしました。

関連する問題