1

我目前正在发出弹性搜索请求以检索一些数据。我已经成功地以 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

0

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

于 2016-12-02T10:08:40.483 回答