如何在Spring Data ElasticSearch中将结果大小设置为零

bla*_*ith 4 java elasticsearch spring-data-elasticsearch

考虑以下Elasticsearch查询:

{
  "query": {"match_all": {}},
  "size": 0, 
  "aggs": {
      "Terms": { "terms": { "field":"fileName" }
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

在这里,我只对聚合感兴趣,而不对文档感兴趣。这就是我设置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();
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

问题:spring数据中有什么方法可以将文档大小限制为零?

Ale*_*lex 5

我们可以定义空的可分页接口实现类,如下所示:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

使用:

    SearchQuery searchQuery = new NativeSearchQueryBuilder()
            .withQuery(queryBuilder)
            .withIndices(indexName).withTypes(typeName)
            .addAggregation(aggsBuilder)
            .withPageable(EmptyPage.INSTANCE)
            .build();
Run Code Online (Sandbox Code Playgroud)

结果:

{
  "aggregations": { ... },
  "from": 0,
  "query": { ... },
  "size": 0
}
Run Code Online (Sandbox Code Playgroud)


mut*_*nUp 5

从 Spring Data Elasticsearch 4.0 开始,NativeSearchQueryStringQuery一个CriteriaQuery方法setMaxResults(Integer maxResults)

所以查询是

NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withIndices(indexName).withTypes(typeName)
                .withQuery(queryBuilder).withAggregation(aggsBuilder)
                .build();

searchQuery.setMaxResults(0);
Run Code Online (Sandbox Code Playgroud)

setMaxResults()方法返回void,因此不能与构建器语法一起使用

这将添加"size":0到请求对象的顶部