2013-10-27 179 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

就是這樣!謝謝! –