2013-10-27 140 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; 

问题是,当我申请geo_distance或其他一些过滤器,这会影响该方面返回的内容。我只希望这个方面受到查询的影响,所以如果$search变量返回100个结果,然后地理距离将其减少到10,那么方面应该返回100个结果中的所有类别,而不是10个。这可以使用elasticsearch吗?

回答

3

您可以通过使用top-level filter而不是“过滤”查询实现这一目标。在你的情况下,它可能看起来像这样:

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

就是这样!谢谢! –