折叠和展开结果

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

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

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

折叠查询解析器

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

CollapsingQParserPlugin 完全支持 QueryElevationComponent。

折叠查询解析器选项

CollapsingQParser 接受以下本地参数

字段

必需

默认值:无

正在折叠的字段。该字段必须是单值的 String、Int 或 Float 类型的字段。

minmax

可选

默认值:无

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

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

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

sort

可选

默认值:无

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

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

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

nullPolicy

可选

默认值:ignore

有三种可用的 null 策略

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

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

  • collapse:将所有具有 null 值的文档折叠成一个组,并使用最高得分或最小值/最大值。

hint

可选

默认值:无

有两个可用的 hint 选项

  • top_fc:表示顶层 FieldCache。

    只有在对字符串字段进行折叠时,才能使用 top_fc hint。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 上进行折叠,并使用 null 策略,以便将 group_field 中没有值的所有文档都视为一个组。对于每个组,将首先基于 numeric_field 选择文档,但平局将按分数打破

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

group_field 上进行折叠,并使用 hint 来使用顶层字段缓存

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

以自定义 cost 进行折叠,默认为 100

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

块折叠

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

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

但是,当在 _root_ 字段上进行折叠时,该逻辑知道,当它扫描索引时,它永远不会在它以前处理过的组中遇到任何新文档。

这种更高效的逻辑也可以与其他 collapseField 值一起使用,通过 hint=block 本地参数。当您有深度嵌套的文档并且希望在 _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”扩展组的支持。与所有扩展组一样,仅当主组包含相应的文档以进行扩展(通过使用 nullPolicy=collapsenullPolicy=expandcollapse;或通过 expand.q找到属于此扩展组的文档时,它才存在。