2015-02-01 3 views
1

일부 조건에 따라 필터링 된 값에 집계를 수행하려고합니다. Spring 데이터의 ElasticSearchTemplate.query() 메서드를 사용하여 쿼리를 실행하고 결과 추출기에서 결과를 가져옵니다. 히트가 올바르게 표시됩니다 (필터가 적용되고 해당 값과 일치하는 문서 만 검색됩니다). 그러나 모든 문서에서 집계가 수행됩니다. 필터링 된 값에만 집계를 적용해야한다고 생각합니다. 다음은 내가 사용하고있는 코드입니다 :스프링 데이터 필터가있는 ElastiSearch 집계

SearchQuery query = //get the query  
SearchResponse hits = template.query(query, new ResultsExtractor<SearchResponse>() { 
       @Override 
       public SearchResponse extract(SearchResponse response) { 
        return response; 
       } 
      }); 

문제를 추가로 디버깅하기 위해 스프링 데이터를 사용하는 대신 쿼리를 실행하는 코드를 작성했습니다. 다음은 코드입니다.

놀랍게도이 쿼리는 올바르게 실행되고 필터는 집계에도 적용되었습니다. 추가로 분석하기 위해 elasticsearchtemplate 코드를 살펴본 결과 setPostFilter 메서드를 사용하여 필터를 설정한다는 사실을 발견했습니다. 그런 다음 코드를 수정하여 필터를 설정합니다.

SearchRequestBuilder builder = esSetup.client().prepareSearch("document"); 
//   builder.setQuery(QueryBuilders.filteredQuery(QueryBuilders.matchAllQuery(), query.getFilter())); 
      builder.setPostFilter(query.getFilter()); 
      builder.addFields(query.getFields().toArray(new String[query.getFields().size()])); 
      for(AbstractAggregationBuilder aggregation : query.getAggregations()){ 
       builder.addAggregation(aggregation); 
      } 
      SearchResponse response = builder.get(); 

위 코드를 실행하면 스프링 데이터와 동일한 동작을 보입니다! (예 : 필터가 쿼리에는 적용되었지만 집계에는 적용되지 않았습니다.) 이것은 스프링 데이터 es의 버그입니까? 그렇다면 원하는 방식으로 데이터를 검색하는 데 사용해야하는 다른 방법이 있습니까?

감사합니다. 미리.

답변

7

이 문제 Elasticsearch 디자인하는 것이다. 매우 간단한 즉

집계 및 포스트 필터에 입력 요청 본문의 query 부와 일치 된 문서들의 집합이다. 따라서 집계 적용되지 필터링 된 문서를 통해.

그러나 필터링 된 문서에 집계를 적용하려면 query 섹션 안의 필터 이동, 즉 filtered query을 사용하십시오. 이제 query 섹션의 출력은 필터링 된 문서 집합이되며 집계가 예상대로 적용됩니다.

요구 사항에 따라 게시 필터 대신 필터링 된 쿼리를 사용하십시오.

+0

또 다른 옵션은 필터 집계 (http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-bucket-filter-aggregation.html)를 사용하는 것입니다.하지만 그것은 과도 할 것입니다. 추측. 필터링 된 쿼리를 사용하는 것이 가장 좋은 방법입니다. – bittusarkar

+0

필터링 된 쿼리를 사용하고 매력처럼 작동 .. 솔루션 주셔서 감사합니다 :) 많이 인정 .. –