为什么我的java elasticsearch请求转换无效?

时间:2016-12-01 18:10:57

标签: java elasticsearch aggregate elasticsearch-query

我目前正在制作弹性搜索请求来检索一些数据。我成功地以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中?

谢谢你们。

1 个答案:

答案 0 :(得分:0)

谢谢你们。我终于解决了这个问题。 java发送了很好的查询,但我在ES java API中看错了地方。尽管如此,我还是将请求类型添加到COUNT中,以避免ES向我发回对我无用的非聚合数据。