转换数据

流式表达式提供了一组强大的函数来转换结果集。本用户指南的这一部分概述了应用于结果集的有用转换。

选择和添加字段

select 函数包装另一个流式表达式,可以对流中的每个元组执行以下操作

  • 选择字段的子集

  • 字段映射到新名称

  • 计算新字段

下面是一个示例,显示 select 函数包装 search 函数并将字段映射到新字段名称。recNum 函数是一个数学表达式,它只返回元组的当前记录号。select 表达式可以调用任何数学表达式来计算新值。

select1

下面是一个示例,使用 div 函数从两个现有字段计算新字段

select math

筛选元组

having 函数可用于根据布尔逻辑筛选流中的元组。

在下面的示例中,having 函数正在筛选 facet 函数的输出,以仅发出 count(*) 大于 20404 的元组。

having

分页

可以使用 recNum 函数添加的记录号进行筛选,以支持分页。

在下面的示例中,使用带有嵌套 ltgt 函数的 and 函数来选择特定记录号范围内的记录

search page

处理 Null 值

notNullisNull 函数可用于将 null 值替换为不同的值,或者筛选出具有 null 值的元组。

下面的示例在 select 函数内部使用 isNull 函数将 null 值替换为 -1。if 函数接受 3 个参数。第一个是布尔表达式,在这种情况下为 isNull。如果布尔函数返回 true,则 if 函数返回第二个参数,如果返回 false,则返回第三个参数。在本例中,isNull 始终为 true,因为它正在检查元组中未包含在结果集中的字段。

select2

notNullisNull 也可以与 having 函数一起使用,以筛选出具有 null 值的元组。

下面的示例发出所有文档,因为它正在为不在结果集中的字段评估 isNull,该字段始终返回 true。

having2

下面的示例发出零个文档,因为它正在为不在结果集中的字段评估 notNull,该字段始终返回 false。

having3

正则表达式匹配和筛选

matches 函数可以在 having 函数内部使用,以测试记录中的字段是否与特定的正则表达式匹配。这允许对搜索结果进行复杂的正则表达式匹配。

下面的示例使用 matches 函数返回 complaint_type_s 字段以 Commercial 结尾的所有记录。

search matches

排序

sorttop 函数可用于在内存中对结果集进行重新排序。 sort 函数会根据排序条件对整个结果集进行排序并返回。 top 函数可用于根据排序条件返回结果集中的前 N 个值。

search resort

汇总

rolluphashRollup 函数可用于对结果集执行聚合操作。这与使用 JSON facet API 将聚合操作推送到搜索引擎中的 facetfacet2Dtimeseries 聚合函数不同。

rollup 函数执行 Map-Reduce 样式的汇总,这要求结果流按分组字段排序。 这允许对非常高基数的字段进行聚合。 hashRollup 函数执行汇总,将所有桶保留在内存中的哈希映射中。 这需要足够的内存来存储内存中所有不同的分组依据字段,但不要求底层流被排序。

下面的示例展示了来自 nyc311 投诉数据库随机样本的前 5 种投诉类型的可视化。 top 函数用于根据 hashRollup 输出的 count(*) 字段选择前 5 种投诉类型。

hashRollup