Агрегирование терминов упорядочения Elasticsearch после поля в верхнем совпадении

Я хотел бы заказать сегменты из агрегации терминов на основе свойства, которым обладает первый элемент в агрегации топ-хитов.

Мой лучший запрос выглядит так (с синтаксическими ошибками):

{
    "aggregations": {
        "toBeOrdered": {
            "terms": {
                "field": "parent_uuid",
                "size": 1000000,
                "order": {
                    "topAnswer._source.id": "asc"
                }
            },
            "aggregations": {
                "topAnswer": {
                    "top_hits": {
                        "size": 1
                    }
                }
            }
        }
    }
}

Кто-нибудь знает, как этого добиться?

Пример:

{
  "a":1,
  "b":2,
  "id":4
}
{
  "a":1,
  "b":3,
  "id":1
}
{
  "a":2,
  "b":4,
  "id":3
}

Группировка по "a" и упорядочение сегментов по "id" (desc) и сортировка лучших совпадений по "b" (desc) даст:

{2:{
  "a":2,
  "b":4,
  "id":3
},1:{
  "a":1,
  "b":3,
  "id":1
}}

1 ответ

Вы можете сделать это с помощью следующего запроса. Идея состоит в том, чтобы показать для каждого parent_uuid ведро первый топ хит с минимальным id значение и сортировать parent_uuid ведра по наименьшему id значение, а с помощью min суб-агрегации.

{
  "aggregations": {
    "toBeOrdered": {
      "terms": {
        "field": "parent_uuid",
        "size": 1000000,
        "order": {
          "topSort": "desc"
        }
      },
      "aggregations": {
        "topAnswer": {
          "top_hits": {
            "size": 1,
            "sort": {
              "b": "desc"
            }
          }
        },
        "topSort": {
          "max": {
            "field": "id"
          }
        }
      }
    }
  }
}

Попробуйте и сообщите, если это сработает для вас.

Другие вопросы по тегам