1

我有一个 60 位(一小时中的分钟数)字段,我想使用按位or运算符进行聚合,以便如果任何贡献值都设置了该位,则最终结果是一个位设置。

位字段的表示尚未确定,但最好让它有点紧凑,因为有很多记录进入聚合。

假设我们有三个文档,其中一个位域采用二进制值:0001, 1001, 1100. 逐位or聚合会将它们组合到值1101- 如果该位设置为任何值,则该位为真。很像求和聚合,而是按位运算。

我考虑过一个位位置数组(如果设置了位,则位置存在),但它有点冗长。

脚本化的度量聚合是可能的,但我有点不知道如何实现它。

脚本化的度量 agg 看起来像这个破碎的无痛代码:

"aggs": {
    "profit": {
      "scripted_metric": {
        "init_script": "minagg = 0L", 
        "map_script": "minagg = minagg | minutes",
     }
   }
 }

感谢您的关注。

4

1 回答 1

0

脚本化的度量聚合处理这个。使用具有以下映射的索引...

"mappings": {
  "default": {
    "dynamic": "strict",
    "properties": {
      "bitfield": {
        "type": "long"
      }
    }
  }
}

...此聚合提供 or'd 值:

POST /bitfield/_search
{
  "query": {
    "match_all": {}
  },
  "size": 0,
  "aggs": {
    "orfield": {
      "scripted_metric": {
        "init_script": "state.agg = 0L",
        "map_script": "state.agg |= doc.bitfield.value",
        "combine_script": "return state.agg",
        "reduce_script": "long total = 0L; for (a in states) {total |= a} return total"
      }
    }
  }
}
于 2021-01-25T23:28:33.513 回答