как отсортировать ключ корзины в целое число в elasticsearch?

#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. это неправильно?