Сортировать агрегацию нескольких сегментов по исходным полям внутри внутренней агрегации нескольких сегментов - PullRequest
0 голосов
/ 10 января 2020

TL; DR: Используя внутреннюю агрегацию с несколькими ведрами (top_hits с size: 1) внутри внешней агрегации с несколькими ведрами, можно сортировать сегменты внешних агрегация по данным во внутренних сегментах?


У меня есть следующие сопоставления индексов

{
  "parent": {
    "properties": {
      "children": {
        "type": "nested",
        "properties": {
          "child_id": { "type": "keyword" }
        }
      }
    }
  }
}

, и каждый дочерний элемент (в данных) также имеет свойства last_modified: Date и other_property: String.

Мне нужно получить список детей (всех родителей, но без родителей), но только одного с последним last_modified на каждого child_id. Затем мне нужно отсортировать и разбить на страницы эти результаты, чтобы получить управляемые объемы данных.

Я могу получить данные и разбить их на страницы с помощью комбинации nested, terms, top_hits, и bucket_sort агрегации (а также получить общее количество с cardinality)

{
  "query": {
    "match_all": {}
  },
  "size": 0,
  "aggs": {
    "children": {
        "nested": {
            "path": "children"
        },
        "aggs": {
            "totalCount": {
                "cardinality": {
                    "field": "children.child_id"
                }
            },
            "oneChildPerId": {
                "terms": {
                    "field": "children.child_id",
                    "order": { "_term": "asc" },
                    "size": 1000000
                },
                "aggs": {
                    "lastModified": {
                        "top_hits": {
                            "_source": [
                                "children.other_property"
                            ],
                            "sort": {
                                "children.last_modified": {
                                    "order": "desc"
                                }
                            },
                            "size": 1
                        }
                    },
                    "paginate": {
                        "bucket_sort": {
                            "from": 36,
                            "size": 3
                        }
                    }
                }
            }
        }
    }
  }
}

, но после более чем 1055 * дня изучения документов и экспериментов, я, кажется, не ближе к выяснить, как отсортировать сегменты моего oneChildPerId агрегации по other_property этого единственного дочернего элемента, полученного с помощью lastModified агрегации.

Есть ли способ сортировки агрегации с несколькими сегментами по результатам вложенного объединения нескольких сегментов?


Что я пробовал:

  • Я думал, что мог бы использовать для этого тоже bucket_sort, но по-видимому, его sort можно использовать только с путями, содержащими другие агрегаты с одним сегментом и заканчивающимися мети c единицей.
  • Я пытался найти способ каким-то образом преобразовать мультипоток 1-результата ведро с lastModified в одно ведро, но не нашло ни одного.

Я использую ElasticSearch 6.8.6 (bucket_sort и аналогичные инструменты не были доступны в ES 5.x и старше).

...