#elasticsearch
#elasticsearch
Вопрос:
у меня проблема с сортировкой по ключу корзины.
как мне отсортировать ключ корзины по целому числу?
это мой запрос.
{
"aggregations": {
"by_time": {
"terms": {
"script": {
"source": "Instant.ofEpochMilli(doc['statdate'].date.millis).atZone(ZoneId.of(params.tz)).hour",
"lang": "painless",
"params": {
"tz": "Asia/Seoul"
}
},
"size": 10,
"min_doc_count": 0,
"shard_min_doc_count": 0,
"show_term_doc_count_error": false,
"order": {
"_key": "asc"
}
}
}
}
и результат.
{
"aggregations": {
"sterms#by_time": {
"buckets": [
{
"key": "11",
"doc_count": 1
},
{
"key": "19",
"doc_count": 1
},
{
"key": "22",
"doc_count": 1
}
},
{
"key": "7",
"doc_count": 1
},
{
"key": "9",
"doc_count": 7
}
]
}
}
но я не хочу этого результата.
я думаю, что этот тип ключа — string.
как я могу отсортировать по целочисленному ключу?
Комментарии:
1. не могли бы вы поделиться своими индексными данными, отображением и ожидаемым результатом поиска?
2. сопоставление ` «сопоставления»: { «тренд»: { «свойства»: { «pfno»: { «тип»: «ключевое слово» }, «statdate»: { «тип»: «дата» }, «просмотр страницы»: { «тип»: «длинный» } } }}`
3. спасибо за ваш ответ 🙂 Не могли бы вы также поделиться своим ожидаемым результатом поиска?
4. я хочу результат { «агрегации»: { «sterms#by_time»: { «корзины»: [ { «ключ»: «7», «doc_count»: 1 }, { «ключ»: «9», «doc_count»: 7 }, { «ключ»: «11», «doc_count»: 1 }, { «key»: «19», «doc_count»: 1 }, { «key»: «22», «doc_count»: 1 } } ] } }
Ответ №1:
Вам нужно использовать агрегацию сортировки корзины, которая представляет собой агрегацию родительского конвейера, которая сортирует сегменты своей родительской агрегации с несколькими сегментами. Вместе с соответствующим порядком сортировки может быть указано ноль или более полей сортировки. Каждая корзина может быть отсортирована на основе ее _key, _count или ее подгруппы.
Попробуйте этот поисковый запрос:
{
"aggregations": {
"by_time": {
"terms": {
"script": {
"source": "Instant.ofEpochMilli(doc['statdate'].date.millis).atZone(ZoneId.of(params.tz)).hour",
"lang": "painless",
"params": {
"tz": "Asia/Seoul"
}
},
"size": 20, <-- note this
"min_doc_count": 0,
"shard_min_doc_count": 0,
"show_term_doc_count_error": false,
"order": {
"_key": "asc"
}
},
"aggs": {
"bucket_truncate": {
"bucket_sort": { <-- note this
"sort": [
{
"_key": {
"order": "asc"
}
}
],
"size": 20 <-- note this
}
}
}
}
}
}
Добавление рабочего примера с индексными данными, поисковым запросом и результатом поиска
Индексировать данные:
{
"id":"1",
"title":"a"
}
{
"id":"3",
"title":"c"
}
{
"id":"2",
"title":"b"
}
{
"id":"2",
"title":"c"
}
Поисковый запрос:
{
"size": 0,
"aggs": {
"unique_id": {
"terms": {
"field": "id.keyword"
},
"aggs": {
"bucket_truncate": {
"bucket_sort": {
"sort": [
{
"_key": {
"order": "asc"
}
}
]
}
}
}
}
}
}
Результат поиска:
"aggregations": {
"unique_id": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "1",
"doc_count": 1
},
{
"key": "2",
"doc_count": 2
},
{
"key": "3",
"doc_count": 1
}
]
}
}
Комментарии:
1. Спасибо. но этот запрос работает только под «10». ключ результата [ «1», «2», «3», «4», … «23», «24» ]
2. @khasui вы можете добавить параметр size, который указывает количество возвращаемых сегментов. (По умолчанию используются все сегменты родительской агрегации.) Пожалуйста, просмотрите мой обновленный ответ и дайте мне знать, решит ли это вашу проблему
3. @khasui поскольку в вашем запросе агрегации терминов вы явно указали размер как 10, вам также необходимо его изменить 🙂
4. я пытаюсь. но это тоже не работает. можете ли вы добавить ключ «10» или «11»?
5. { «aggr»: { «by_time»: { «terms»: { … «size»: 20, … «order»: { «_key»: «asc» } }, «aggr»: { «sort»: { «bucket_sort»: { «sort»: [ { «_key»: { «order»: «asc» } } ], «из «: 0», «size»: 20, «gap_policy»: «ПРОПУСТИТЬ» } } } } } } я добавил размер агрегации и размер терминов 20. это неправильно?