Сейчас я использую 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
Агрегации Elasticsearch: попытка использовать сортировку по алфавиту в агрегации терминов ⇐ Elasticsearch aggregation
1733357307
Anonymous
Сейчас я использую Elasticsearch 8.15. Я немного запутался, пытаясь добиться сортировки строк по внешнему и внутреннему сегменту (отсортировано по возрастанию или убыванию в алфавитном порядке). Мой индекс [b]опасность[/b] выглядит примерно так:
{
"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").
После ответа эластичного поиска я обрабатываю кластеры так, чтобы самая первая запись в корзине стала «[b]основной[/b]» угрозой, а следующие опасности в корзине станут «[b]основными[/b]», «[b]кластеризованными[/b]» опасностями. Я решаю, как выбрать «[b]основную[/b]» опасность, путем сортировки внутри сегментов. Таким образом, наиболее релевантной угрозой в зависимости от критериев сортировки станет «[b]основная[/b]» угроза и первый элемент в сегменте.
Для метрики 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"}
}
}
[b]Вот пример запроса, который я использую для определения вероятности:[/b]
"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"
}
}
}
}
}
[b]А вот пример запроса, который я пытаюсь использовать для сортировки типа опасности:[/b]
"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"
}
}
}
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79253061/elasticsearch-aggregations-trying-to-use-an-alphabetical-bucket-sort-within-a-t[/url]
Ответить
1 сообщение
• Страница 1 из 1
Вернуться в «Elasticsearch aggregation»
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия