сортировка результатов агрегации в эластичном поиске - PullRequest
0 голосов
/ 01 февраля 2019

Я написал запрос, чтобы получить последние записи по идентификатору из моего ES.Но результат этого запроса выполняет только внутреннюю сортировку и выбирает самые последние записи.Теперь мне нужно отсортировать результаты по дате.

Это мой запрос:

{
   "size":0,
   "query":{
      "bool":{
         "must":[
            {
               "match":{
                  "base":"XYZ"
               }
            },
            {
               "match":{
                  "Type":"low"
               }
            }
         ]
      }
   },
   "aggs":{
      "sources":{
         "terms":{
            "field":"Id"
         },
         "aggs":{
            "latest":{
               "top_hits":{
                  "size":1,

                  "_source":{
                     "includes":[
                        "base",
                        "Type"
                     ]
                  },
                  "sort":{
                     "orderDate":"desc"
                  }
               }
            }
         }
      }
   }
}

1 Ответ

0 голосов
/ 02 февраля 2019

То, что вы пытаетесь сделать, это сортировать ведра по другому другому ведру.Это можно сделать двумя способами:

(a) bucket_sort агрегация

(b) с помощью параметра order для агрегирования терминов, ссылающихся на другой сегмент.

(a) агрегация bucket_sort

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

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "base": "XYZ"
          }
        },
        {
          "match": {
            "Type": "low"
          }
        }
      ]
    }
  },
  "aggs": {
    "source": {
      "terms": {
        "field": "id"
      },
      "aggs": {
        "latest": {
          "top_hits": {
            "size": 1,
            "_source": {
              "includes": [
                "base",
                "Type"
              ]
            },
            "sort": {
              "orderDate": "desc"
            }
          }
        },
        "latestOrder": {
          "max": {
            "field": "orderDate"
          }
        },
        "bucket_sort_order": {
          "bucket_sort": {
            "sort": {
              "latestOrder": {
                "order": "desc"
              }
            }
          }
        }
      }
    }
  },
  "post_filter": {
    "term": {
      "status": "yes"
    }
  }
}

В приведенном выше запросе я использовал максимальное агрегирование, названное latestOrder.Эта агрегация дает нам значение для последнего orderDate.Если мы посмотрим на агрегацию верхнего попадания, то возвращенный им документ будет иметь то же значение orderDate, что и максимальное агрегирование, т.е. latestOrder.Причина в том, что мы упорядочили верхнее попадание orderDate в деск и ограничили размер до единицы, что эквивалентно max orderDate.

latestOrder работает как поле сортировки для нас, которое затем используетсяв агрегации bucket_sort для сортировки родительских сегментов, которые представляют собой сегменты, возвращаемые агрегацией терминов.

(b) order param в терминах agg

Мы используем тот же подход, что и выше.Мы используем максимальное агрегирование latestOrder и указываем его в order параметре агрегации терминов.Таким образом, запрос будет:

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "base": "XYZ"
          }
        },
        {
          "match": {
            "Type": "low"
          }
        }
      ]
    }
  },
  "aggs": {
    "source": {
      "terms": {
        "field": "id",
        "order": {
          "latestOrder": "desc"
        }
      },
      "aggs": {
        "latest": {
          "top_hits": {
            "size": 1,
            "_source": {
              "includes": [
                "base",
                "Type",
                "orderDate"
              ]
            },
            "sort": {
              "orderDate": "desc"
            }
          }
        },
        "latestOrder": {
          "max": {
            "field":"orderDate"
          }
        }
      }
    }
  },
  "post_filter": {
    "term": {
      "status": "yes"
    }
  }
}

ОБНОВЛЕНИЕ в запросах : На основе обсуждения в комментариях добавлен post_filter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...