考虑以下elasticsearch查询:
{
"query": {"match_all": {}},
"size": 0,
"aggs": {
"Terms": { "terms": { "field":"fileName" }
}
}
}
在这里,我只对聚合感兴趣,而不是文档。这就是我设置size:0
并且它按预期工作的原因。但是我无法用spring-data
实现相同的目标。代码示例:
PageRequest page = new PageRequest(0, 0);
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withIndices(indexName).withTypes(typeName)
.withQuery(queryBuilder).withAggregation(aggsBuilder)
.withPageable(pageable).build();
此PageRequest
构造函数抛出一个异常,该异常来自其父代:
public AbstractPageRequest(int page, int size) {
if (page < 0) {
throw new IllegalArgumentException("Page index must not be less than zero!");
}
if (size < 1) {
throw new IllegalArgumentException("Page size must not be less than one!");
}
this.page = page;
this.size = size;
}
问题:弹簧数据中有没有办法将文档大小限制为零?
答案 0 :(得分:4)
我们可以定义空的可分页接口实现类,如下所示:
public static class EmptyPage implements Pageable {
public static final EmptyPage INSTANCE = new EmptyPage();
@Override
public int getPageNumber() {
return 0;
}
@Override
public int getPageSize() {
return 0;
}
@Override
public int getOffset() {
return 0;
}
@Override
public Sort getSort() {
return null;
}
@Override
public Pageable next() {
return null;
}
@Override
public Pageable previousOrFirst() {
return null;
}
@Override
public Pageable first() {
return null;
}
@Override
public boolean hasPrevious() {
return false;
}
}
使用:
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(queryBuilder)
.withIndices(indexName).withTypes(typeName)
.addAggregation(aggsBuilder)
.withPageable(EmptyPage.INSTANCE)
.build();
结果:
{
"aggregations": { ... },
"from": 0,
"query": { ... },
"size": 0
}
答案 1 :(得分:2)
如果您正在使用ES 1.x,那么您可以忽略Pageable
并指定搜索类型COUNT
。
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withIndices(indexName).withTypes(typeName)
.withQuery(queryBuilder).withAggregation(aggsBuilder)
.withSearchType(SearchType.COUNT).build();
从ES 2.x开始,SearchType.COUNT
将被弃用,不再可用,但对于ES 1.x需求,这应该可以胜任。
请注意,其他用户也有similar need,但问题仍然存在。
答案 2 :(得分:1)
这有点晚了,但可能对未来的开发者有用。我的方法是定义一个新类PageRequest
,它实现org.springframework.data.domain.Pageable
和类似org.springframework.data.domain.PageRequest
,但在大小上没有AbstractPageRequest
的约束。
然后你可以将它传递给你的建设者。
答案 3 :(得分:0)
从 Spring Data Elasticsearch 4.0 开始,NativeSearchQuery
、StringQuery
和 CriteriaQuery
有一个方法 setMaxResults(Integer maxResults)
所以查询将是
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
.withIndices(indexName).withTypes(typeName)
.withQuery(queryBuilder).withAggregation(aggsBuilder)
.build();
searchQuery.setMaxResults(0);
setMaxResults()
方法返回 void
,因此不能与构建器语法一起使用
这将在请求对象的顶部添加 "size":0
答案 4 :(得分:-1)
我认为你想要的是在代码中设置"size": 0
吗?
聚合不支持分页,因此PageRequest
将不受理。错误是因为页面限制不能为0.您需要的是:
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withIndices(indexName).withTypes(typeName)
.withQuery(queryBuilder)
.withAggregation(aggsBuilder.size(0)) //set the size with AggregationBuilders
.withSearchType(SearchType.COUNT)
.build();