Anonymous
Как подсчитать уникальные активы с определенной серьезностью в Elasticsearch?
Сообщение
Anonymous » 27 июн 2024, 20:58
У меня есть следующие данные:
Код: Выделить всё
{
"_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
1719511088
Anonymous
У меня есть следующие данные: [code]{ "_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": "..." } [/code] [b]Цель[/b]: подсчитать уникальные объекты с уровнем серьезности 1 или 2. Если у объекта есть оба уровня серьезности, учитывайте только тот, который имеет уровень серьезности 1. Вот мой вопрос: [code]{ "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 } } } } } } [/code] Я добавил Bucket_selector, чтобы возвращать уровни серьезности, равные 1 или 2, а не обе. Однако при этом не учитываются активы, которые могут иметь обе степени серьезности, поскольку одновременно проверяется один документ. Как я могу изменить свой запрос, чтобы гарантировать, что актив учитывается только с уровнем серьезности 1, если он имеет оба уровня серьезности? Будем очень признательны за любые советы или предложения по улучшению моего запроса. Заранее спасибо! Подробнее здесь: [url]https://stackoverflow.com/questions/78675079/how-to-count-unique-assets-with-specific-severity-in-elasticsearch[/url]