2016-12-01 46 views
1

我目前正在做一个elasticsearch请求来检索一些数据。我已经成功地以Json格式编写正确的请求。之后,我试图将其转换为Java。但是,当我打印Java发送给ES的请求时,两个请求都不一样,我也没有做到这一点。为什么我的java elasticsearch请求翻译无效?

这里是返回好数据的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会自动使用默认值,然后等于'“from”:0,“size”:10' – ruhungry

+0

您正在使用哪个版本的ES? – Val

回答

0

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

相关问题