转换数据

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

选择和添加字段

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

  • 选择字段的子集

  • 映射字段到新名称

  • 计算新字段

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

select1

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

select math

过滤元组

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

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

having

分页

使用 recNum 函数添加的记录编号可以进行过滤以支持分页。

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

search page

处理空值

notNullisNull 函数可用于将空值替换为不同的值,或过滤掉带有空值的元组。

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

select2

notNullisNull 还可以与 having 函数一起使用,以过滤掉带有空值的元组。

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

having2

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

having3

正则表达式匹配和过滤

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

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

search matches

排序

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

search resort

汇总

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

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

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

hashRollup