Как агрегировать битовое поле в Elasticsearch?

У меня есть 60-битное (минуты в часе) поле, которое я хотел бы агрегировать с помощью побитового оператора, чтобы конечный результат был установлен в битах, если какое-либо из участвующих значений имело этот бит.

Представление битового поля еще не определено, но было бы неплохо сделать его несколько компактным, так как в агрегацию входит много записей.

Скажем, у нас есть три документа с битовым полем, принимающим двоичные значения: 0001, 1001, 1100. Немного мудрый orагрегация объединит их в значение 1101- бит истинен, если этот бит установлен в любое значение. Очень похоже на агрегацию суммы, но вместо этого побитовая операция.

Я рассмотрел массив битовых позиций (позиция присутствует, если бит установлен), но он становится немного подробным.

Агрегирование метрик по сценарию возможно, но я немного не понимаю, как его реализовать.

Заскриптованная метрика agg выглядела бы примерно так:

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

Спасибо, что посмотрели.

1 ответ

Агрегирование метрик по сценарию обрабатывает это. С индексом со следующим сопоставлением...

      "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"
      }
    }
  }
}
Другие вопросы по тегам