【问题标题】:Aggregation Support for Spring Data Elastic SearchSpring Data Elastic Search 的聚合支持
【发布时间】:2015-05-12 07:46:39
【问题描述】:

弹性搜索已弃用 Facets,建议使用聚合 (http://www.elastic.co/guide/en/elasticsearch/reference/1.x/search-aggregations.html)。

Spring Data Elastic Search 目前支持这个吗?

如果是,是否有可用的样品?

【问题讨论】:

    标签: spring-data-elasticsearch


    【解决方案1】:

    是的,支持聚合。

    例子:

        @Test
        public void shouldReturnAggregatedResponseForGivenSearchQuery() {
        // given
        IndexQuery article1 = new ArticleEntityBuilder("1").title("article four").subject("computing").addAuthor(RIZWAN_IDREES).addAuthor(ARTUR_KONCZAK).addAuthor(MOHSIN_HUSEN).addAuthor(JONATHAN_YAN).score(10).buildIndex();
        IndexQuery article2 = new ArticleEntityBuilder("2").title("article three").subject("computing").addAuthor(RIZWAN_IDREES).addAuthor(ARTUR_KONCZAK).addAuthor(MOHSIN_HUSEN).addPublishedYear(YEAR_2000).score(20).buildIndex();
        IndexQuery article3 = new ArticleEntityBuilder("3").title("article two").subject("computing").addAuthor(RIZWAN_IDREES).addAuthor(ARTUR_KONCZAK).addPublishedYear(YEAR_2001).addPublishedYear(YEAR_2000).score(30).buildIndex();
        IndexQuery article4 = new ArticleEntityBuilder("4").title("article one").subject("accounting").addAuthor(RIZWAN_IDREES).addPublishedYear(YEAR_2002).addPublishedYear(YEAR_2001).addPublishedYear(YEAR_2000).score(40).buildIndex();
    
        elasticsearchTemplate.index(article1);
        elasticsearchTemplate.index(article2);
        elasticsearchTemplate.index(article3);
        elasticsearchTemplate.index(article4);
        elasticsearchTemplate.refresh(ArticleEntity.class, true);
    
        SearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withQuery(matchAllQuery())
                .withSearchType(COUNT)
                .withIndices("articles").withTypes("article")
                .addAggregation(terms("subjects").field("subject"))
                .build();
        // when
        Aggregations aggregations = elasticsearchTemplate.query(searchQuery, new ResultsExtractor<Aggregations>() {
            @Override
            public Aggregations extract(SearchResponse response) {
                return response.getAggregations();
            }
        });
        // then
        assertThat(aggregations, is(notNullValue()));
        assertThat(aggregations.asMap().get("subjects"), is(notNullValue()));
    }
    

    代码复制自ElasticsearchTemplateAggregationTests.java

    【讨论】:

    • 我用的一样,但是提取聚合部分需要相当长的时间,因此我的响应时间越来越长
    【解决方案2】:

    为了防止第二次调用 elasticsearch,您可以直接提取 serachResult。

    elasticsearchTemplate.query(query.build(), new ResultsExtractor<Object>() {
            @Override
            public Object extract(SearchResponse searchResponse) {
                Aggregations aggregations = searchResponse.getAggregations();
                List<AnyClass> ta = new DefaultResultMapper().mapResults(searchResponse, AnyClass.class, new PageRequest(page != null ? page : 0, 15)).getContent();
                return ta;
            }
        });
    

    【讨论】:

      猜你喜欢
      • 2016-03-29
      • 2018-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-15
      • 2014-06-29
      • 1970-01-01
      • 2014-07-06
      相关资源
      最近更新 更多