lucene - 仅根据查询获取分面结果

标签 lucene elasticsearch faceted-search

我有一些帖子数据,我使用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可以吗?

最佳答案

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

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

关于lucene - 仅根据查询获取分面结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19622516/

相关文章:

symfony1 - symfony 中的 Doctrine 可搜索行为与 Zend Lucene

elasticsearch - Elassandra单节点群集未启动。陷入突变阶段

solr - 在 Solr 中进行分层分面的方法?

java - IndexWriter.commit() 不足以更改索引

solr - Solr 4 生产准备好了吗?

java - Elasticsearch Completion - 按分数返回前 10 名文档

elasticsearch - 在一个字段中匹配所有部分单词

php - 寻找分面导航教程

elasticsearch - ElasticSearch日期字段统计

elasticsearch - 如何标准化 ElasticSearch 分数?