Xunsearch PHP-SDK v1.4.9 权威指南

# 按字段值分面搜索

分面搜索在英文中通常表述为 `Facets Search`，被检索的数据通具有多维度属性。 例如一本书包含主题、作者、年代等，而分面搜索是指通过事物的这些属性不断筛选、 过滤搜索结果的方法，可以将分面搜索看成搜索和浏览的结合。

如果您还是不清楚它的概念，敬请参阅这篇文章。

## 1. 适用情况?

在 `xunsearch` 中，分面搜索是按照字段的值来实现的，为了结合条件做筛选搜索， 支持分面的字段需要进行索引，而它的分词方式最好必须是 `full` 即整值索引。

## 2. 用法详细示范?

以论坛文章搜索为例，每篇文章均属于不同版块（字段为 fid）、不同的发表年份 （字段为 year），我们需要在搜索结果中按年份、版块显示匹配的文章数。

那么在构建搜索语句时使用 XSSearch::setFacets 方法来指定需要分面的字段， 该方法接受两个参数，第一参数为要分面的字段名称（多个字段请用数组作参数）， 第二参数是可选的布尔类型，true 表示需要准确统计，默认 false 则为估算。

执行搜索之后再调用 XSSearch::getFacets 方法可取回分面搜索结果。

    // 在搜索时加入分面设置
    $docs = $search->setQuery('关键词')->setFacets(array('fid', 'year'))->search();

    // 读取分面结果
    $fid_counts = $search->getFacets('fid'); // 返回数组，以 fid 为键，匹配数量为值
    $year_counts = $search->getFacets('year'); // 返回数组，以 year 为键，匹配数量为值

    // 遍历 $fid_counts, $year_counts 变量即可得到各自筛选条件下的匹配数量
    foreach ($fid_counts as $fid => $count)
    {
        echo "其中版块ID为 $fid 的匹配数为: $count\n";
    }

    // ...
    // 通常可以循环生成新的搜索链接，在搜索链接中加入字段搜索条件即可
    // ...

    // 然后像往常一样使用 $docs 显示文档

> Tip: 出于性能考虑，分面搜索返回的匹配数量默认是估算的，比实际数量可能会偏小。 如果您确实需要得到精确数字，请将 XSSearch::setFacets 的第二参数设为 true 。

> 此外，分面搜索仅针对字段值较短的情况，当字段值的长度超过 255 字节时会被忽略而不参与统计。

> 每次搜索最多同时支持 8 个字段进行分面搜索，分面字段必须是“字符串”类型。

$Id$
« 搜索建议和纠错
RequiredCheck 运行检测 »
Copyright © 2008-2011 by 杭州云圣网络科技有限公司
All Rights Reserved.