Как агрегировать битовое поле в 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"
}
}
}
}