折叠和展开结果

折叠查询解析器和展开组件结合使用,形成了一种在搜索结果中对文档进行字段折叠分组的方法。

折叠查询解析器根据您的参数对文档进行分组(折叠结果集),而展开组件提供对折叠组中文档的访问,以便在结果显示中使用或由客户端应用程序进行其他处理。折叠和展开可以共同完成较旧的结果分组group=true)对大多数用例(但并非全部)所做的工作。启用结果分组时,不支持折叠和展开。通常,您应该优先选择折叠和展开。

为了在 SolrCloud 中使用这些功能,文档必须位于同一分片上。为了确保文档共置,您可以在创建集合时将 router.name 参数定义为 compositeId。有关此选项的更多信息,请参阅文档路由一节。

折叠查询解析器

CollapsingQParser 实际上是一个后置过滤器,当结果集中不同组的数量较高时,它比 Solr 的标准方法提供性能更高的字段折叠。此解析器将结果集折叠到每个组一个文档,然后再将结果集转发到其他搜索组件。因此,所有下游组件(分面、高亮显示等)都将使用折叠后的结果集。

CollapsingQParserPlugin 完全支持 QueryElevationComponent。

折叠查询解析器选项

CollapsingQParser 接受以下本地参数

字段

必需

默认值:无

正在折叠的字段。该字段必须是单值字符串、整数或浮点数类型的字段。

minmax

可选

默认值:无

根据指定数字字段或函数查询的最小值或最大值选择每个组的组头文档。

最多只能指定一个 minmaxsort(见下文)参数。

如果未指定任何参数,则将根据该组中得分最高的文档选择每个组的组头文档。

sort

可选

默认值:无

根据指定排序字符串,选择每个组中第一个文档作为组头文档。

最多只能指定一个 minmax(见上文)或 sort 参数。

如果未指定任何参数,则将根据该组中得分最高的文档选择每个组的组头文档。

nullPolicy

可选

默认值:ignore

有三种可用的 null 策略

  • ignore:删除折叠字段中值为 null 的文档。

  • expand:将折叠字段中值为 null 的每个文档视为一个单独的组。

  • collapse:使用最高得分或最小值/最大值将所有值为 null 的文档折叠到一个组中。

hint

可选

默认值:无

有两个提示选项可用

  • top_fc:代表顶级 FieldCache。

    top_fc 提示仅在折叠字符串字段时可用。top_fc 通常提供最佳查询时间速度,但在启动或提交后需要最长时间预热。如果 top_fc 用于分面或排序,它还将导致折叠字段在内存中缓存两次。对于非常高的基数(高不同计数)字段,top_fc 可能不太好。

  • block:表示正在折叠的字段适用于下面描述的优化块折叠逻辑。

size

可选

默认值:100000

仅在折叠数字字段时设置折叠数据结构的初始大小。

在按数字字段折叠时,用于折叠的数据结构会动态增长。将大小设置为高于结果集中预期结果数量将消除调整大小的成本。

collectElevatedDocsWhenCollapsing

可选

默认值:true

结合折叠查询解析器,所有提升的文档在结果集的开头可见。如果此参数为 false,则仅当提升的文档具有相同的折叠键时,代表才可见。

示例用法语法

group_field 上折叠,选择每个组中得分最高的文档

fq={!collapse field=group_field}

group_field 上折叠,选择每个组中 numeric_field 值最小的文档

fq={!collapse field=group_field min=numeric_field}

group_field 上折叠,选择每个组中 numeric_field 值最大的文档

fq={!collapse field=group_field max=numeric_field}

group_field 上折叠,选择每个组中函数值最大的文档。请注意,cscore() 函数可与 min/max 选项结合使用,以使用正在折叠的当前文档的得分。

fq={!collapse field=group_field max=sum(cscore(),numeric_field)}

group_field 上折叠,并使用空策略,以便将 group_field 中没有值的文档视为单个组。对于每个组,所选文档将首先基于 numeric_field,但评分将打破平局

fq={!collapse field=group_field nullPolicy=collapse sort='numeric_field asc, score desc'}

group_field 上折叠,并提示使用顶级字段缓存

fq={!collapse field=group_field hint=top_fc}

使用自定义 cost 进行折叠,其默认值为 100

fq={!collapse cost=1000 field=group_field}

块折叠

_root_ 字段上折叠时,使用 nullPolicy=expandnullPolicy=ignore,折叠查询解析器可以利用以下事实:具有相同字段值的所有文档在索引中彼此相邻,位于单个"嵌套文档块"中。这使得折叠逻辑可以更快、更省内存。

默认折叠逻辑必须跟踪所有组头文档——对于到目前为止遇到的所有组——直到它评估所有文档,因为它考虑的每个文档都可能成为任何组的新组头。

然而,在 _root_ 字段上折叠时,逻辑知道在扫描索引时,它永远不会在先前处理过的组中遇到任何新文档。

这种更有效的逻辑还可以通过本地参数 hint=block 与其他 collapseField 值一起使用。当您有深度嵌套的文档并且您想在某个字段上折叠时,该字段对于具有公共 _root_ 的所有文档不包含相同的值,但对于公共 _root_ 下的连续文档集而言是唯一且相同的值,这可能很有用。例如:搜索“孙子”文档并在“子文档”中唯一的字段上折叠

在连续文档块中每个字段不唯一时指定 hint=block 不受支持,并且可能会以意外的方式失败;包括静默返回不正确结果的可能性。

该实现不提供针对不受支持字段的误用保护,因为这样做需要与非块折叠实现相同的组级别跟踪——这会破坏此优化的目的。

展开组件

ExpandComponent 可用于展开由 CollapsingQParserPlugin 折叠的组。

与 CollapsingQParserPlugin 一起使用的示例

q=foo&fq={!collapse field=ISBN}

在上面的查询中,CollapsingQParserPlugin 将在 ISBN 字段上折叠搜索结果。主要搜索结果将包含每本书中排名最高的文档。

现在可以使用 ExpandComponent 展开结果,以便您可以看到按 ISBN 分组的文档。例如

q=foo&fq={!collapse field=ISBN}&expand=true

当与 CollapsingQParserPlugin 一起使用并且有多个折叠组时,该字段将从成本最低的组中选择。如果有多个具有相同成本的折叠组,则选择第一个指定的组。

启用后,ExpandComponent 会在搜索输出中添加一个名为 expanded 的新部分。

expanded 部分内,有一个 映射,每个组头指向组内的展开文档。当应用程序迭代主要折叠结果集时,它们可以访问 expanded 映射以检索展开组。

ExpandComponent 具有以下参数

expand

必需

默认值:无

true 时,ExpandComponent 被启用。

expand.field

可选

默认值:无

需要填充展开文档的字段。当 expand=true 时,需要指定此参数或与 CollapsingQParserPlugin 一起使用。当两者都指定时,此参数具有更高的优先级。

expand.sort

可选

默认值:score desc

对展开组中的文档进行排序。

expand.rows

可选

默认值:5

在每个组中显示的行数。

expand.rows=0 时,仅返回为每个展开值找到的文档数。因此,即使请求并设置 maxScore 为 0,也不会计算分数。

expand.q

可选

默认值:无

覆盖主查询 (q),确定要包含在主组中的文档。默认情况下,使用主查询。

expand.fq

可选

默认值:无

覆盖主过滤器查询 (fq),确定要包含在主组中的文档。默认情况下,使用主过滤器查询。

expand.nullGroup

可选

默认值:false

指示是否可以返回包含展开字段中没有值的文档的展开组。此选项仅启用支持返回“null”展开组。与所有展开组一样,它仅在主组包含相应文档以供其展开(通过 collapse 使用 nullPolicy=collapsenullPolicy=expand;或通过 expand.q并且找到属于此展开组的文档时才存在。