Elasti c: сортировка по отдельным полям в документе - PullRequest
1 голос
/ 18 февраля 2020

У меня есть следующие документы в индексе моих сотрудников:

[
  {
    "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".

Любая помощь приветствуется.

...