У меня есть следующие документы в индексе моих сотрудников:
[
{
"employee_id": 12345,
"department_id": 45678,
"first_name": "John",
"last_name": "Doe",
"country_name": "United States",
"zip": "94086"
},
{
"employee_id": 23456,
"department_id": 45678,
"first_name": "Johnny",
"last_name": "Kepler",
"country_name": "United States",
"zip": "94088"
},
{
"employee_id": 34567,
"department_id": 56789,
"first_name": "Johnson",
"last_name": "Musk",
"country_name": "Canada",
"zip": "T6X 0Z4"
},
{
"employee_id": 78967,
"department_id": 67890,
"first_name": "Johnniso",
"last_name": "Garza",
"country_name": "Mexico",
"zip": "01110"
}
]
На высоком уровне необходимая функциональность заключается в группировке по «отдела_идентификации» (то есть, только один уникальный идентификатор отдела должен быть возвращен с самый высокий балл). Я ожидаю, что результат запроса к «Джону» будет примерно таким, как показано ниже: (одно попадание в корзину, отсортировано по Department_id)
[
{
"employee_id": 12345,
"department_id": 45678,
"first_name": "John",
"last_name": "Doe",
"country_name": "United States",
"zip": "94086"
},
{
"employee_id": 34567,
"department_id": 56789,
"first_name": "Johnson",
"last_name": "Musk",
"country_name": "Canada",
"zip": "T6X 0Z4"
},
{
"employee_id": 78967,
"department_id": 67890,
"first_name": "Johnniso",
"last_name": "Garza",
"country_name": "Mexico",
"zip": "01110"
}
]
Примечание: 2-й документ должен быть пропущен, так как его оценка меньше, чем 1-й документ, а также идентификаторы департамента одинаковы для 1-го и 2-го, поэтому должен быть возвращен только один.
Я вижу, что сортировка по группам поддерживает сортировку только по _key, _count и другим агрегатам, если есть способ сортировки, используя, скажем, название страны или почтовый индекс тоже?
Запрос, который я пытаюсь выполнить (с агрегациями):
Я выполняю агрегирование терминов с субагрегацией с наибольшим количеством совпадений (размер 1, так как мне нужен только самый верхний результат) и сортировка по сегментам.
{
"size": 0,
"query": {
"bool": {
"should": [
{
"query_string": {
"query": "*John*",
"default_field": "first_name"
}
}
],
"minimum_should_match": "1"
}
},
"aggregations": {
"clusters": {
"terms": {
"field": "department_id",
"size": 1000000
},
"aggregations": {
"employees": {
"top_hits": {
"from": 0,
"size": 1,
"_source": {
"includes": [
"employee_id",
"department_id",
"first_name",
"last_name",
"country_name",
"zip"
]
}
}
},
"employee_bucket_sort": {
"bucket_sort": {
"sort": [
{
"_key": {
"order": "asc"
}
}
],
"from": 0,
"size": 10,
"gap_policy": "SKIP"
}
}
}
}
}
}
Использование "порядка" в агрегации top_hits мне не помогает, поскольку оно сортирует документы внутри хитов, а не по сегментам.
Я хочу сегменты сортируется по стране, фамилии или любому другому полю, в котором агрегация терминов не выполняется.
Для большей ясности, скажем, агрегация терминов выполняется по "отдел_ид", сортировка сегментов должно быть сделано на "country_name".
Любая помощь приветствуется.