elasticsearch,faceted-search,Lucene,elasticsearch,Faceted Search" /> elasticsearch,faceted-search,Lucene,elasticsearch,Faceted Search" />

Lucene 仅基于查询获取分面结果

Lucene 仅基于查询获取分面结果,lucene,elasticsearch,faceted-search,Lucene,elasticsearch,Faceted Search,我有一些帖子数据,我使用elasticsearch搜索这些帖子的标题。然后,我使用过滤器根据类别ID和一些其他参数过滤结果。我试图做的是获取与查询条件匹配的所有类别的帖子,并忽略过滤器 以下是我迄今为止所做的工作。这是查询部分: if ( ! empty($search) ) { $query['multi_match'] = array( 'query' => $search, 'fields' => array('title', 'titl

我有一些帖子数据,我使用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
或其他一些过滤器时,这会影响facet返回的内容。我希望facet只受查询的影响,因此如果
$search
变量返回100个结果,然后地理距离将其减少到10,facet应该返回100个结果中的所有类别,而不是10个。使用elasticsearch可以吗?

您可以通过使用而不是“过滤”查询来实现这一点。在您的情况下,它可能如下所示:

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