首页 > 解决方案 > 使用 Spring-data-elasticsearch、ElasticsearchRepository 从 Elasticsearch 获取聚合信息

问题描述

我想从 ES 中获取聚合结果,例如avgSize(名称为“大小”的字段的平均值),totalhits用于匹配术语的文档,以及将来的其他一些聚合结果,我认为ElasticsearchRepository没有任何方法可以调用。我构建了查询和聚合构建器,如下所示。我想使用我的 Repository 接口,但我不确定返回的 ObjectType 应该是什么?它应该是我的 DTO 中的文档类型吗?我也看到searchQuery了直接传递给的例子,ElasticsearchTemplate但是扩展存储库接口的意义何在ElasticsearchRepository

Repository Interface

public interface CCFilesSummaryRepository extends ElasticsearchRepository<DataReferenceSummary, UUID> {

}

Elastic configuration

@Configuration
@EnableElasticsearchRepositories(basePackages = "com.xxx.repository.es")
public class ElasticConfiguration {
    @Bean
    public ElasticsearchOperations elasticsearchTemplate() throws UnknownHostException {
        return new ElasticsearchTemplate(elasticsearchClient());
    }
    @Bean
    public Client elasticsearchClient() throws UnknownHostException {
        Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
        TransportClient client = new PreBuiltTransportClient(settings);
        client.addTransportAddress(new TransportAddress(InetAddress.getLocalHost(), 9200));
        return client;
    }
}

Service Method

  public DataReferenceSummary createSummary(final DataSet dataSet) {
    try {


      QueryBuilder queryBuilder = QueryBuilders.matchQuery("type" , dataSet.getDataSetCreateRequest().getContentType());
      AvgAggregationBuilder avgAggregationBuilder =  AggregationBuilders.avg("avg_size").field("size");
      ValueCountAggregationBuilder valueCountAggregationBuilder = AggregationBuilders.count("total_references")
              .field("asset_id");

      SearchQuery searchQuery = new NativeSearchQueryBuilder()
              .withQuery(queryBuilder)
              .addAggregation(avgAggregationBuilder)
              .addAggregation(valueCountAggregationBuilder)
              .build();


      return ccFilesSummaryRepository.search(searchQuery).iterator().next();


    } catch (Exception e){
      e.printStackTrace();
    }
    return null;

  }

DataReferernceSummary现在只是一个 POJO,我在构建过程中遇到了一个错误,上面写着Unable to build Bean CCFilesSummaryRepository, illegalArgumentException DataReferernceSummary. is not a amanged Object

标签: elasticsearchspring-data-elasticsearchelasticsearch-java-api

解决方案


首先DataReferenceSummary必须是一个用 注释的类@Document

在 Spring Data Elasticsearch 3.2.0(当前版本)中,您需要将存储库返回类型定义为AggregatedPage<DataReferenceSummary>,返回的对象将包含聚合。

从即将发布的 4.0 版开始,您必须将返回类型定义为SearchHits<DataReferenceSummary>并在此返回的对象中查找聚合。


推荐阅读