Spring 数据 elasticsearch 过滤聚合
Spring data elasticsearch Filter aggregations
我有以下 JSON 查询正在运行并且正在执行我想要的操作:
{
"aggs": {
"values": {
"filter": { "term": { "gender": "Male" } },
"aggs" : {
"names" : {
"terms" : { "field" : "name", "size":10000 }
}
}
}
},
"size":0
}
它正在检索“gener”字段等于“Male”的所有不同名称。它是elasticseach中filter aggregation的一个例子。
我现在正在尝试用 spring-data-elasticsearch 编写它,我试过这个:
AbstractAggregationBuilder<TermsAggregationBuilder> agBuilder = AggregationBuilders.terms("name").field("name").size(10000);
Query query = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.matchAllQuery())
.withFilter(QueryBuilders.termQuery("gender", "Male"))
.withPageable(EmptyPage.INSTANCE)
.addAggregation(agBuilder).build();
//Execute request over the cluster
SearchHits<Person> hits = elasticClient.search(query, Person.class);
//Retrieve the aggregation details
Aggregations aggs = hits.getAggregations();
ParsedStringTerms topTags = (ParsedStringTerms) aggs.get("name");
请注意,EmptyPage.INSTANCE
与 PageRequest.of(0,0) 相同,是实现该目的的自定义 Impl。
不幸的是,它没有按照我的意愿行事,因为它忽略了 filter
子句,它返回了男性和女性的名字。
我怀疑 withQuery
应该包含另一个 Query
但我不知道如何将另一个 NativeSearchQuery
传递给该方法。
我使用的版本:
- Spring 数据弹性搜索:4.0.3.RELEASE
- Elasticsearch 客户端:7.6.2
如何使用 spring-data-elasticsearch 编写上述 json 查询?
提前致谢。
过滤器实际上需要在 withQuery()
内。
Query query = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.termQuery("gender", "Male"))
...
withFilter
有另一个用途,即 post_filter
.
另请注意,您正在构建的查询与问题顶部指定的查询略有不同,它看起来像下面的查询,实际上是一个更优化的版本,因为您正在过滤文档 before 进行聚合,而不是对所有文档进行聚合,只考虑与过滤器匹配的文档。最终结果是一样的,但是性能却不一样。
{
"size": 0,
"query": {
"term": {
"gender": "Male"
}
},
"aggs": {
"names": {
"terms": {
"field": "name",
"size": 10000
}
}
}
}
我有以下 JSON 查询正在运行并且正在执行我想要的操作:
{
"aggs": {
"values": {
"filter": { "term": { "gender": "Male" } },
"aggs" : {
"names" : {
"terms" : { "field" : "name", "size":10000 }
}
}
}
},
"size":0
}
它正在检索“gener”字段等于“Male”的所有不同名称。它是elasticseach中filter aggregation的一个例子。
我现在正在尝试用 spring-data-elasticsearch 编写它,我试过这个:
AbstractAggregationBuilder<TermsAggregationBuilder> agBuilder = AggregationBuilders.terms("name").field("name").size(10000);
Query query = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.matchAllQuery())
.withFilter(QueryBuilders.termQuery("gender", "Male"))
.withPageable(EmptyPage.INSTANCE)
.addAggregation(agBuilder).build();
//Execute request over the cluster
SearchHits<Person> hits = elasticClient.search(query, Person.class);
//Retrieve the aggregation details
Aggregations aggs = hits.getAggregations();
ParsedStringTerms topTags = (ParsedStringTerms) aggs.get("name");
请注意,EmptyPage.INSTANCE
与 PageRequest.of(0,0) 相同,是实现该目的的自定义 Impl。
不幸的是,它没有按照我的意愿行事,因为它忽略了 filter
子句,它返回了男性和女性的名字。
我怀疑 withQuery
应该包含另一个 Query
但我不知道如何将另一个 NativeSearchQuery
传递给该方法。
我使用的版本:
- Spring 数据弹性搜索:4.0.3.RELEASE
- Elasticsearch 客户端:7.6.2
如何使用 spring-data-elasticsearch 编写上述 json 查询? 提前致谢。
过滤器实际上需要在 withQuery()
内。
Query query = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.termQuery("gender", "Male"))
...
withFilter
有另一个用途,即 post_filter
.
另请注意,您正在构建的查询与问题顶部指定的查询略有不同,它看起来像下面的查询,实际上是一个更优化的版本,因为您正在过滤文档 before 进行聚合,而不是对所有文档进行聚合,只考虑与过滤器匹配的文档。最终结果是一样的,但是性能却不一样。
{
"size": 0,
"query": {
"term": {
"gender": "Male"
}
},
"aggs": {
"names": {
"terms": {
"field": "name",
"size": 10000
}
}
}
}