2013-10-27 3 views
2

일부 게시물 데이터가 있으며이 게시물의 제목을 검색하기 위해 elasticsearch를 사용합니다. 그런 다음 필터를 사용하여 범주 ID 및 기타 매개 변수를 기반으로 결과를 필터링합니다. 내가하려는 것은 쿼리 기준과 일치하는 모든 범주의 게시물을 가져 와서 필터를 무시하는 것입니다.쿼리에만 기반한 패싯 처리 된 결과 얻기

여기까지 제가 한 것입니다.

if (! empty($search)) 
{ 
    $query['multi_match'] = array(
     'query' => $search, 
     'fields' => array('title', 'title_en') 
    ); 
} 

은 그럼 어떤 필터를 적용 :이 쿼리 부분입니다

if (! empty($loc)) 
{ 
    $filter['bool']['must'][]['geo_distance'] = array(
     'distance' => $distance . 'meters', 
     'loc'  => $loc 
    ); 
} 

if (isset($category)) 
{ 
    $filter['bool']['must'][]['terms'] = array(
     'categories' => $category 
    ); 
} 

그리고 내가 패싯 부분 :

$facets = array(
    'categories' => array(
     'terms' => array(
      'field' => 'categories' 
     ) 
    ) 
); 

과 마지막 부분 :

$searchParams['body']['query']['filtered'] = array(
    'query' => $query, 
    'filter' => $filter, 
); 
$searchParams['body']['facets'] = $facets; 

문제는 내가를 적용 할 때입니다.또는 다른 필터를 사용하면 패싯에서 반환하는 값에 영향을줍니다. 패싯이 쿼리의 영향을 받기를 원하므로 $search 변수가 100 개의 결과를 반환하고 지리적 거리가 10으로 줄어들면 패싯은 100 개의 결과에서 모든 범주를 반환해야하며 그렇지 않으면 10을 반환해야합니다. elasticsearch를 사용하여 가능한가요?

답변

3

"필터링 된"쿼리 대신 top-level filter을 사용하면이 작업을 수행 할 수 있습니다. 귀하의 경우 다음과 같이 보일 것입니다 :

$searchParams['body']['query'] = $query; 
$searchParams['body']['filter'] = $filter; 
$searchParams['body']['facets'] = $facets; 
+0

그게 전부입니다! 감사! –