导出结果集

/export 请求处理程序允许使用特殊的 等级查询解析器响应编写器 将完全排序的结果集从 Solr 中流出。它们经过专门设计,可协同工作,以处理涉及对数百万条记录进行排序和导出的场景。

此功能使用流排序技术,从毫秒内开始发送记录,并持续传输结果,直到对整个结果集进行排序并导出。

此功能可能会有用的情况包括:会话分析、分布式合并连接、时间序列汇总、高基数字段上的聚合、完全分布式字段折叠和基于排序的统计信息。

字段要求

所有要排序和导出的字段都必须将 docValues 设置为 true。有关更多信息,请参阅 DocValues 部分。

/export RequestHandler

具有适当配置的 /export 请求处理程序是 Solr 的开箱即用请求处理程序之一 - 有关更多信息,请参阅 隐式请求处理程序

请注意,此请求处理程序的属性被定义为“不变式”,这意味着它们不能被其他属性在其他时间(例如查询时间)传递时覆盖。

请求结果导出

您可以使用 /export 对查询的结果集进行导出请求。

所有查询都必须包含 sortfl 参数,否则查询将返回错误。还支持筛选器查询。

可选参数 batchSize 确定部分结果的内部缓冲区大小。默认值为 30000,但用户可能希望指定较小的值以限制内存使用(以牺牲性能为代价),或指定较高的值以提高导出性能(这种关系不是线性的,较大的值不会带来成比例的性能提升)。

支持的响应编写器是 jsonjavabin。出于向后兼容性的原因,wt=xsort 也作为输入得到支持,但 wt=xsort 的行为与 wt=json 相同。默认输出格式为 json

下面是一个导出某些已索引日志数据的请求示例

http://localhost:8983/solr/core_name/export?q=my-query&sort=severity+desc,timestamp+desc&fl=severity,timestamp,msg

指定排序条件

sort 属性定义了文档将在导出的结果集中如何排序。可以按具有 int、long、float、double、string 字段类型的任何字段对结果进行排序。排序字段必须是单值字段。

随着添加更多排序字段,导出性能会变慢。如果 JVM 外部有足够的物理内存可用于加载排序字段,则性能会随着排序字段的添加而线性下降。否则可能会变得更糟。

指定字段列表

fl 属性定义将随结果集一起导出的字段。字段列表中可以使用任何可排序的字段类型(即 int、long、float、double、string、date、boolean)。这些字段可以是单值或多值。

可以使用通配符模式作为字段列表(例如 fl=*_i),并且将扩展到与该模式匹配且可以导出的字段列表,请参阅 字段要求

目前不支持返回评分。

指定本地流表达式

可选的 expr 属性定义一个 流表达式,该表达式允许在结果集中导出文档之前在本地处理文档。

表达式必须使用一个特殊的 input() 流,该流表示来自 /export 处理程序的原始结果。然后,流表达式的输出将变为 /export 处理程序的输出。对于此流表达式,始终设置 &streamLocalOnly=true 标志。

这些表达式中仅支持流 装饰器评估器 - 使用除预定义的 input() 之外的任何 表达式都将导致错误。

将流表达式与 /export 处理程序一起使用可能会由于在内存中减少要返回的文档数量而显著提高性能。

以下是如何使用 top 装饰器仅返回前 N 个结果的示例

http://localhost:8983/solr/core_name/export?q=my-query&sort=timestamp+desc,&fl=timestamp,reporter,severity&expr=top(n=2,input(),sort="timestamp+desc")

(请注意,top 装饰器中的排序规范必须与处理程序参数中的排序规范匹配)。

以下是如何使用 unique 装饰器的示例

http://localhost:8983/solr/core_name/export?q=my-query&sort=reporter+desc,&fl=reporter&expr=unique(input(),over="reporter")

(请注意,over 参数必须使用 fl 参数中请求的一个字段)。

分布式支持

有关分布式支持,请参阅 流表达式 部分。