0

当事件“X”达到其最大值时(例如在过去一个月或过去 7 天或一天内),如何获取事件“X”的 5 分钟时间窗口,并在它达到最大值时获取事件时间。

4

2 回答 2

1

如果我理解正确,您有带有“已创建”元素(或其他名称)的文档。假设您在该元素上有一个 dateTime 范围索引。

您要做的是以 5 分钟间隔存储这些时间,然后找到人口最多的存储桶。搜索和 REST API 均提供分作为功能。这通常与较少数量的存储桶一起使用,但请尝试一下。

如果这不起作用,您可以手动执行类似的操作,只需构建您需要的存储桶。

(: untested :)
let $buckets := map:map()
let $populate :=
  for $dt in cts:values(cts:element-reference(xs:QName("created")), (), (), $query)
  let $bucket := local:bucket($dt)
  return 
    map:put(
      $buckets, 
      $bucket, 
      (map:get($buckets, $bucket), 0)[1] + cts:frequency($dt)
let $inverse := -$buckets
let $max-count := fn:max(map:keys($inverse))
let $max-bucket := map:get($inverse, $max-count)

$max-bucket将是具有最多值的桶的序列(如果有平局,则不止一个)。您将用于$query缩小目标月份(或其他时间范围)。你需要实现local:bucket()——

declare function local:bucket($dt as xs:dateTime)

找出一些唯一的键来识别 5 分钟的间隔并返回它。

于 2016-01-19T12:47:14.647 回答
0

构建持续时间为 5 分钟的存储桶并不是 MarkLogic 特定的。下面是一些 XQuery,它从 2000 年 1 月 1 日午夜开始为您提供 10,000 个 5 分钟的存储桶。(大约 35 天):

let $ranges as xs:dateTime+ := 
  for $d in (0 to 10000) 
  return xs:dateTime("2000-01-01T00:00:00") + (xs:dayTimeDuration("PT300S") * $d)
return $ranges

我将创建开始和结束边界作为用户练习。

于 2016-01-20T20:12:01.863 回答