Elasticsearch如何获取aggs下的filter的doc_count值?

huangapple go评论187阅读模式
英文:

How does Elasticsearch get the doc_count value of the filter under aggs?

问题

这是你提供的代码的翻译部分:

  1. 我在使用elasticsearch的聚合查询时遇到了一些问题以下是我使用的DSL语句
  2. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  3. TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("terms_valid_year");
  4. FilterAggregationBuilder filter = AggregationBuilders.filter("filters", QueryBuilders.rangeQuery("valid_year").gte(6));
  5. termsAggregationBuilder.field("valid_year");
  6. termsAggregationBuilder.size(5);
  7. termsAggregationBuilder.order(BucketOrder.key(true));
  8. sourceBuilder.aggregation(termsAggregationBuilder.subAggregation(filter));
  9. searchRequest.source(sourceBuilder);
  10. ReturnValue returnValue = new ReturnValue();
  11. LinkedList<Object> list = new LinkedList<>();
  12. try {
  13. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  14. Terms terms = searchResponse.getAggregations().get("terms_valid_year");
  15. List<? extends Terms.Bucket> buckets = terms.getBuckets();
  16. Filter filterResult = searchResponse.getAggregations().get("filters");
  17. long docCount1 = filterResult.getDocCount();
  18. System.out.println("docCount1 = " + docCount1);
  19. for (Terms.Bucket bucket : buckets) {
  20. String keyAsString = bucket.getKeyAsString();
  21. long docCount = bucket.getDocCount();
  22. returnValue.setFieldName(keyAsString);
  23. returnValue.setDocValue(docCount);
  24. System.out.println(returnValue.toString());
  25. }
  26. }

希望这有助于你解决问题。如果你有其他问题或需要进一步的帮助,请随时提问。

英文:

I encountered some problems when using elasticsearch's aggregation query.This is the DSL statement I used

  1. {
  2. &quot;size&quot;: 0,
  3. &quot;aggs&quot;: {
  4. &quot;terms_vlid_year&quot;:{
  5. &quot;terms&quot;: {
  6. &quot;field&quot;: &quot;valid_year&quot;,
  7. &quot;size&quot;: 5,
  8. &quot;order&quot;: {
  9. &quot;_key&quot;: &quot;asc&quot;
  10. }
  11. }
  12. },
  13. &quot;filterss&quot;:{
  14. &quot;filter&quot;: {
  15. &quot;range&quot;: {
  16. &quot;valid_year&quot;: {
  17. &quot;gte&quot;: 6
  18. }
  19. }
  20. }
  21. }
  22. }
  23. }

This is the aggregate result

  1. &quot;aggregations&quot; : {
  2. &quot;terms_vlid_year&quot; : {
  3. &quot;doc_count_error_upper_bound&quot; : 0,
  4. &quot;sum_other_doc_count&quot; : 13918850,
  5. &quot;buckets&quot; : [
  6. {
  7. &quot;key&quot; : 1,
  8. &quot;doc_count&quot; : 1632006
  9. },
  10. {
  11. &quot;key&quot; : 2,
  12. &quot;doc_count&quot; : 3588976
  13. },
  14. {
  15. &quot;key&quot; : 3,
  16. &quot;doc_count&quot; : 3710637
  17. },
  18. {
  19. &quot;key&quot; : 4,
  20. &quot;doc_count&quot; : 2948910
  21. },
  22. {
  23. &quot;key&quot; : 5,
  24. &quot;doc_count&quot; : 2672394
  25. }
  26. ]
  27. },
  28. &quot;filters&quot; : {
  29. &quot;doc_count&quot; : 13918850
  30. }
  31. }

Now I want to use java to get the doc_count of filters.Below is my java code, But the doc_count value of the filter object cannot be obtained through the filterResult.getDocCount(). How to solve this problem?

  1. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  2. TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms(&quot;terms_vlid_year&quot;);
  3. FilterAggregationBuilder filter = AggregationBuilders.filter(&quot;filters&quot;, QueryBuilders.rangeQuery(&quot;valid_year&quot;).gte(6));
  4. termsAggregationBuilder.field(&quot;valid_year&quot;);
  5. termsAggregationBuilder.size(5);
  6. termsAggregationBuilder.order(BucketOrder.key(true));
  7. sourceBuilder.aggregation(termsAggregationBuilder.subAggregation(filter));
  8. searchRequest.source(sourceBuilder);
  9. ReturnValue returnValue = new ReturnValue();
  10. LinkedList&lt;Object&gt; list = new LinkedList&lt;&gt;();
  11. try {
  12. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  13. Terms terms = searchResponse.getAggregations().get(&quot;terms_vlid_year&quot;);
  14. List&lt;? extends Terms.Bucket&gt; buckets = terms.getBuckets();
  15. Filter filterResult = searchResponse.getAggregations().get(&quot;filters&quot;);
  16. long docCount1 = filterResult.getDocCount();
  17. System.out.println(&quot;docCount1 = &quot; + docCount1);
  18. for (Terms.Bucket bucket : buckets) {
  19. String keyAsString = bucket.getKeyAsString();
  20. long docCount = bucket.getDocCount();
  21. returnValue.setFieldName(keyAsString);
  22. returnValue.setDocValue(docCount);
  23. System.out.println(returnValue.toString());
  24. }
  25. }

答案1

得分: 0

现在问题已解决。FilterAggregation 不能在 termsAggregation 内使用子聚合,它们属于同一级别。要获得所需的结果,应该这样做:

  1. sourceBuilder.aggregation(termsAggregationBuilder);
  2. FilterAggregationBuilder filter = AggregationBuilders.filter("filters", QueryBuilders.rangeQuery("valid_year").gte(6));
  3. sourceBuilder.aggregation(filter);
英文:

Now the problem has been solved.FilterAggregation cannot use subAggregation nested in termsAggregation, they belong to the same level.It should be this way to get the desired result:

  1. sourceBuilder.aggregation(termsAggregationBuilder);
  2. FilterAggregationBuilder filter = AggregationBuilders.filter(&quot;filters&quot;, QueryBuilders.rangeQuery(&quot;valid_year&quot;).gte(6));
  3. sourceBuilder.aggregation(filter);

huangapple
  • 本文由 发表于 2020年8月14日 11:00:51
  • 转载请务必保留本文链接:https://go.coder-hub.com/63405903.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定