elasticsearch,Java,elasticsearch" /> elasticsearch,Java,elasticsearch" />

Java elasticsearch-聚合和筛选器的问题

Java elasticsearch-聚合和筛选器的问题,java,elasticsearch,Java,elasticsearch,我正在使用传输客户端从Elasticsearch检索数据 示例代码段: String[] names = {"Stokes","Roshan"}; BoolQueryBuilder builder = QueryBuilders.boolQuery(); AggregationBuilder<?> aggregation = AggregationBuilders.filters("agg") .filter(builder.filter(QueryBuilders.term

我正在使用传输客户端从Elasticsearch检索数据

示例代码段:

String[] names = {"Stokes","Roshan"};
BoolQueryBuilder builder = QueryBuilders.boolQuery();
AggregationBuilder<?> aggregation = AggregationBuilders.filters("agg")
    .filter(builder.filter(QueryBuilders.termsQuery("Name", "Taylor"))
    .filter(QueryBuilders.rangeQuery("grade").lt(9.0)))
    .subAggregation(AggregationBuilders.terms("by_year").field("year")
    .subAggregation(AggregationBuilders.sum("sum_marks").field("marks"))
    .subAggregation(AggregationBuilders.sum("sum_grade").field("grade")));
SearchResponse response = client.prepareSearch(index)
    .setTypes(datasquareID)
    .addAggregation(aggregation)
    .execute().actionGet();
System.out.println(response.toString());
答复:

"aggregations" : {
    "agg" : {
        "buckets" : [{
                "doc_count" : 0,
                "by_year" : {
                    "doc_count_error_upper_bound" : 0,
                    "sum_other_doc_count" : 0,
                    "buckets" : []
                }
            }
        ]
    }
}

请让我知道我的需求的解决方案。

我认为问题出在您的
过滤器中。总而言之,您希望将聚合过滤到“名为“Stokes”或“Roshan”且分数小于9”的文档中。为了做到这一点

// create the sum aggregations
SumBuilder sumMarks = AggregationBuilders.sum("sum_marks").field("marks");
SumBuilder sumGrades = AggregationBuilders.sum("sum_grade").field("grade");

// create the year aggregation + add the sum sub-aggregations
TermsBuilder yearAgg = AggregationBuilders.terms("by_year").field("year")
    .subAggregation(sumMarks)
    .subAggregation(sumGrades);

// create the bool filter for the condition above
String[] names = {"stokes","roshan"};
BoolQueryBuilder aggFilter = QueryBuilders.boolQuery()
    .must(QueryBuilders.termsQuery("Name", names))
    .must(QueryBuilders.rangeQuery("grade").lte(9.0))

// create the filter aggregation and add the year sub-aggregation
FilterAggregationBuilder aggregation = AggregationBuilders.filter("agg")
    .filter(aggFilter)
    .subAggregation(yearAgg);

// create the request and execute it
SearchResponse response = client.prepareSearch(index)
    .setTypes(datasquareID)
    .addAggregation(aggregation)
    .execute().actionGet();
System.out.println(response.toString());
最后,它将是这样的:

{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "agg": {
      "filter": {
        "bool": {
          "must": [
            {
              "terms": {
                "Name": [
                  "stokes",
                  "roshan"
                ]
              }
            },
            {
              "range": {
                "grade": {
                  "lte": 9
                }
              }
            }
          ]
        }
      },
      "aggs": {
        "by_year": {
          "terms": {
            "field": "year"
          },
          "aggs": {
            "sum_marks": {
              "sum": {
                "field": "marks"
              }
            },
            "sum_grade": {
              "sum": {
                "field": "grade"
              }
            }
          }
        }
      }
    }
  }
}
   "aggregations": {
      "agg": {
         "doc_count": 2,
         "by_year": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
               {
                  "key": 2015,
                  "doc_count": 2,
                  "sum_grade": {
                     "value": 18
                  },
                  "sum_marks": {
                     "value": 176
                  }
               }
            ]
         }
      }
   }
对于上面的文档,结果如下所示:

{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "agg": {
      "filter": {
        "bool": {
          "must": [
            {
              "terms": {
                "Name": [
                  "stokes",
                  "roshan"
                ]
              }
            },
            {
              "range": {
                "grade": {
                  "lte": 9
                }
              }
            }
          ]
        }
      },
      "aggs": {
        "by_year": {
          "terms": {
            "field": "year"
          },
          "aggs": {
            "sum_marks": {
              "sum": {
                "field": "marks"
              }
            },
            "sum_grade": {
              "sum": {
                "field": "grade"
              }
            }
          }
        }
      }
    }
  }
}
   "aggregations": {
      "agg": {
         "doc_count": 2,
         "by_year": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
               {
                  "key": 2015,
                  "doc_count": 2,
                  "sum_grade": {
                     "value": 18
                  },
                  "sum_marks": {
                     "value": 176
                  }
               }
            ]
         }
      }
   }

它打印的结果正确吗?没有。实际上,有一些文件名为“Taylor”,但我没有得到预期的结果。谢谢你的回答。现在工作正常。但是,如果查看文档中的名称字段,它们以大写字母开头,如“name”:“Taylor”“name”:“Stokes”“name”:“Roshan”在术语查询中,您使用小写名称。谢谢您的回答。现在工作正常。但是,如果查看文档中的名称字段,它们以大写字母开头,如“name”:“Taylor”“name”:“Stokes”“name”:“Roshan”,在术语查询中,您使用小写字母的名称。String[]names={“stokes”,“roshan”}但是如果我搜索像String[]names={“stokes”,“roshan”}这样的名称,我不会得到预期的结果。我得到的聚合结果为空。是的,可能是因为映射中分析了
Name
string字段,并且索引时这些值是小写的。如果您将字段设置为
not_analysisted
,您将能够使用大写版本。got it Val。感谢您的帮助。