Как подсчитать уникальные активы с определенной серьезностью в Elasticsearch?Elasticsearch aggregation

Ответить
Anonymous
 Как подсчитать уникальные активы с определенной серьезностью в Elasticsearch?

Сообщение Anonymous »

У меня есть следующие данные:

Код: Выделить всё

{
"_index": "index",
"_id": "...",
"_score": 4.512486,
"_source": {
"division": {
"name": "Ben",
"id": "678"
},
"summary": {
"severity": 2,
"last_issue_at": "...",
"first_issue_at": "...",
"issues_count": 1
},
"company": {
"id": "..."
},
"ingest_timestamp": "..",
"asset": {
"name": "Bus",
"vin": "123",
"id": "...",
"manufacturer": ...
},
"timestamp": "..."
}
{
"_index": "index",
"_id": "...",
"_score": 4.512486,
"_source": {
"division": {
"name": "Ben",
"id": "678"
},
"summary": {
"severity": 1,
"last_issue_at": "...",
"first_issue_at": "...",
"issues_count": 1
},
"company": {
"id": "..."
},
"ingest_timestamp": "..",
"asset": {
"name": "Bus",
"vin": "123",
"id": "...",
"manufacturer": ...
},
"timestamp": "..."
}

Цель: подсчитать уникальные объекты с уровнем серьезности 1 или 2. Если у объекта есть оба уровня серьезности, учитывайте только тот, который имеет уровень серьезности 1.
Вот мой вопрос:

Код: Выделить всё

{
"query": {
"bool": {
"must": [
{
"match": {
"company.id": "..."
}
},
{
"range": {
"timestamp": {
"gte": "...",
"lte": "..."
}
}
}
]
}
},
"runtime_mappings": {
"asset_id_and_vin": {
"type": "keyword",
"script": {
"source": "if (doc.containsKey('asset.vin')) { emit(doc['asset.id'] + ' ' + doc['asset.vin']) } else { emit(doc['asset.id'].value + ' ' + 'N/A') }"
}
}
},
"aggs": {
"asset_count": {
"cardinality": {
"field": "asset_id_and_vin"
}
},
"assets": {
"multi_terms": {
"terms": [
{
"field": "asset.name"
},
{
"field": "asset.vin",
"missing": "N/A"
},
{
"field": "division.name"
},
{
"field": "asset.id"
},
{
"field": "division.id"
}
],
"order": {
"earliest_date": "desc"
},
"size": 100
},
"aggs": {
"severity": {
"min": {
"field": "summary.severity"
}
},
"earliest_date": {
"min": {
"field": "summary.first_issue_at"
}
},
"latest_date": {
"max": {
"field": "summary.last_issue_at"
}
},
"issues": {
"sum": {
"field": "summary.issues_count"
}
},
"filtered_assets": {
"bucket_selector": {
"buckets_path": {
"min_severity": "severity"
},
"script": "params.min_severity == 1 || params.min_severity == 2"
}
},
"pagination": {
"bucket_sort": {
"size": 100,
"from": 0
}
}
}
}
}
}
Я добавил Bucket_selector, чтобы возвращать уровни серьезности, равные 1 или 2, а не обе. Однако при этом не учитываются активы, которые могут иметь обе степени серьезности, поскольку одновременно проверяется один документ. Как я могу изменить свой запрос, чтобы гарантировать, что актив учитывается только с уровнем серьезности 1, если он имеет оба уровня серьезности?
Будем очень признательны за любые советы или предложения по улучшению моего запроса. Заранее спасибо!

Подробнее здесь: https://stackoverflow.com/questions/786 ... sticsearch
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Elasticsearch aggregation»