转换数据
流表达式提供了一组用于转换结果集的强大函数。本用户指南部分概述了应用于结果集的有用转换。
选择和添加字段
select
函数包装另一个流表达式,可以对流中的每个元组执行以下操作
-
选择字段的子集
-
映射字段到新名称
-
计算新字段
以下是一个示例,展示了 select
函数包装 search
函数并将字段映射到新字段名称。recNum
函数是一个数学表达式,它仅返回元组的当前记录号。select
表达式可以调用任何数学表达式来计算新值。
以下是一个使用 div
函数从两个现有字段计算新字段的示例
处理空值
notNull
和 isNull
函数可用于将空值替换为不同的值,或过滤掉带有空值的元组。
下面的示例在 select
函数中使用 isNull
函数将空值替换为 -1。if
函数采用 3 个参数。第一个是布尔表达式,在本例中为 isNull
。如果布尔函数返回 true,则 if
函数返回第二个参数;如果返回 false,则返回第三个参数。在本例中,isNull
始终为 true,因为它正在检查结果集中不包含的元组中的字段。
notNull
和 isNull
还可以与 having
函数一起使用,以过滤掉带有空值的元组。
下面的示例会发出所有文档,因为它正在评估结果集中不存在的字段的 isNull
,该字段始终返回 true。
下面的示例会发出零个文档,因为它正在评估结果集中不存在的字段的 notNull
,该字段始终返回 false。
正则表达式匹配和过滤
matches
函数可以在 having
函数中使用,以测试记录中的字段是否与特定的正则表达式匹配。这允许对搜索结果进行复杂的正则表达式匹配。
下面的示例使用 matches
函数返回 complaint_type_s
字段以 Commercial 结尾的所有记录。
汇总
rollup
和 hashRollup
函数可用于对结果集执行聚合。这不同于 facet
、facet2D
和 timeseries
聚合函数,这些函数使用 JSON facet API 将聚合推送到搜索引擎中。
rollup
函数执行 map-reduce 样式汇总,这要求结果流按分组字段排序。这允许对非常高基数字段进行聚合。hashRollup
函数执行汇总,将所有存储桶保留在内存哈希映射中。这需要有足够的内存来存储内存中所有不同的分组字段,但不要求对底层流进行排序。
以下示例显示了来自 nyc311
投诉数据库的随机样本中排名前 5 位的投诉类型的可视化。top
函数用于根据 hashRollup
输出的 count(*)
字段选择排名前 5 位的投诉类型。