Получите агрегированную информацию из Elasticsearch, используя Spring-data -asticsearch, ElasticsearchRepository - PullRequest
0 голосов
/ 05 марта 2020

Я хотел бы получить агрегированные результаты от ES, такие как avgSize (среднее поле с именем 'size'), totalhits для документов, которые соответствуют термину, и некоторые другие агрегаты в будущем, для которых я не буду ' Я думаю, ElasticsearchRepository имеет какие-либо методы для вызова. Я построил Query и Aggregate Builders, как показано ниже. Я хочу использовать свой интерфейс репозитория, но я не уверен, каким должен быть возвращаемый 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

1 Ответ

0 голосов
/ 06 марта 2020

Первый DataReferenceSummary должен быть классом, аннотированным @Document.

В Spring Data Elasticsearch 3.2.0 (текущая версия) вам необходимо определить тип возвращаемого репозитория как AggregatedPage<DataReferenceSummary>, возвращаемый объект будет содержать агрегаты.

Начиная с следующей версии 4.0, вы должны будете определить тип возвращаемого значения как SearchHits<DataReferenceSummary> и найти агрегаты в этом возвращаемом объекте.

...