Агрегации Elasticsearch: попытка использовать сортировку по алфавиту в агрегации терминовElasticsearch aggregation

Ответить Пред. темаСлед. тема
Anonymous
 Агрегации Elasticsearch: попытка использовать сортировку по алфавиту в агрегации терминов

Сообщение Anonymous »

Сейчас я использую Elasticsearch 8.15. Я немного запутался, пытаясь добиться сортировки строк по внешнему и внутреннему сегменту (отсортировано по возрастанию или убыванию в алфавитном порядке). Мой индекс опасность выглядит примерно так:
{
"hazards" : {
"mappings" : {
"properties" : {
"articleScoreValue" : {
"type" : "long"
},
"bestTime" : {
"type" : "date
"clusterId" : {
"type" : "long"
},
"hazardType" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"id" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"likelihood" : {
"type" : "long"
},
"publishedAt" : {
"type" : "date"
},
}
}
}
}

Я пытаюсь добиться агрегации терминов по моим опасностям, где поле имеет значение ClusterId и размер ~ 10 000. Опасности с одинаковым идентификатором кластера — это опасности, которые очень похожи друг на друга. Мои требования к агрегации — разбивка на страницы и сортировка. В настоящее время я использую Bucket_sort для разбивки моих агрегатов на страницы, а также для их сортировки. Четыре возможных параметра этого вида имеют типы long(articleScoreValue), long(likelihood), date(publishedAt) и text(hazardType.keyword, EX: "WILDFIRE", "ACCIDENT", "CYCLONE").
После ответа эластичного поиска я обрабатываю кластеры так, чтобы самая первая запись в корзине стала «основной» угрозой, а следующие опасности в корзине станут «основными», «кластеризованными» опасностями. Я решаю, как выбрать «основную» опасность, путем сортировки внутри сегментов. Таким образом, наиболее релевантной угрозой в зависимости от критериев сортировки станет «основная» угроза и первый элемент в сегменте.
Для метрики 3 типы сортировки long, long и date, я добился этого с помощью агрегирования метрик min/max, которые Bucket_sort использует для сортировки сегментов в соответствии с ними. Однако у меня возникла проблема при попытке добиться этого с помощью RiskType.keyword. По сути, я хочу, чтобы каждая группа находила опасность с самым высоким или самым низким алфавитным типом опасности, а затем использовала самый высокий или самый низкий тип опасности этой опасности в качестве точки сортировки группы. Затем другие сегменты можно было лексикографически сравнить со своими точками сортировки. Пожалуйста, обязательно, если эта реализация покажется вам неправильной или неэффективной, дайте мне знать, я только начинаю изучать эластичный поиск!
Мой первоначальный подход заключался в использовании агрегации терминов с ключевым словом RiskType.keyword. в качестве поля установите размер 1 и упорядочите его в соответствии с нахождением самого высокого или самого низкого алфавитного типа опасности в сегменте, а затем попробуйте каким-то образом применить это к Bucket_sort.
query["aggs"]["clustered_hazards"]["aggs"]["first_hazard_type"] = {
"terms": {
"field": "hazardType.keyword",
"size": 1,
"order": {"_key": "asc" or "desc"}
}
}

Вот пример запроса, который я использую для определения вероятности:
"query": {
"bool": {
"must": [],
"filter": [
{
"range": {
"likelihood": {
"gte": 3,
"lte": 4
}
}
},
{
"range": {
"articleScoreValue": {
"gte": 7,
"lte": 10
}
}
},
{
"range": {
"publishedAt": {
"gte": "2024-12-01",
"lte": "2024-12-02"
}
}
},
{
"terms": {
"hazardType.keyword": [
"WILDFIRE",
"ACCIDENT",
"CYCLONE"
]
}
},
]
}
},
"aggs": {
"unique_clusters": {
"cardinality": {
"field": "clusterId"
}
},
"clustered_hazards": {
"terms": {
"field": "clusterId",
"size": 10000
},
"aggs": {
"top_hazards": {
"top_hits": {
"size": 6,
"sort": [
{
"likelihood": {
"order": "desc"
}
}
],
"_source": [
"id",
"title",
"clusterId",
"likelihood",
"articleScoreValue",
"publishedAt",
"hazardType"
]
}
},
"paginated_top_hazards": {
"bucket_sort": {
"sort": [
{
"top_likelihood": "desc"
}
],
"from": 0,
"size": 4
}
},
"top_likelihood": {
"max": {
"field": "likelihood"
}
}
}
}
}

А вот пример запроса, который я пытаюсь использовать для сортировки типа опасности:
"query": {
"bool": {
"must": [],
"filter": [
{
"range": {
"likelihood": {
"gte": 3,
"lte": 4
}
}
},
{
"range": {
"articleScoreValue": {
"gte": 7,
"lte": 10
}
}
},
{
"range": {
"publishedAt": {
"gte": "2024-12-01",
"lte": "2024-12-02"
}
}
},
{
"terms": {
"hazardType.keyword": [
"WILDFIRE",
"ACCIDENT",
"CYCLONE"
]
}
},
]
}
},
"aggs": {
"unique_clusters": {
"cardinality": {
"field": "clusterId"
}
},
"clustered_hazards": {
"terms": {
"field": "clusterId",
"size": 10000
},
"aggs": {
"top_hazards": {
"top_hits": {
"size": 6,
"sort": [
{
"hazardType.keyword": {
"order": "desc"
}
}
],
"_source": [
"id",
"title",
"clusterId",
"likelihood",
"articleScoreValue",
"publishedAt",
"hazardType"
]
}
},
"paginated_top_hazards": {
"bucket_sort": {
// Somehow apply the first_hazard_type sort here
"sort": [{"first_hazard_type": {"order": "desc"}}],
"from": 0,
"size": 4
}
},
"first_hazard_type": {
"terms": {
"field": "hazardType.keyword",
"size": 1,
"order": {
"_key": "desc"
}
}
}
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/792 ... within-a-t
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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