1

現在、いくつかのデータを取得するためにelasticsearchリクエストを作成しています。正しいリクエストを 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());

まず、Java が生成する "size":10 と "from" を削除する必要があります。その後、フィルターを追加する必要があります。私はこれを行いましたが、決して追加されません..私のJavaコードで何が間違っているのか、なぜフィルタが最終的なJsonに表示されないのか教えていただけますか?

みんなありがとう。

4

1 に答える 1