Нужна нумерация страниц по Aggreration Groupping Elastic search - PullRequest
0 голосов
/ 31 октября 2019

Мы применяем агрегацию и группировку, для этого нужно разбить на страницы.

let body = {size: item_per_page, "query": {"bool": {"must": [{"rules": {"log_action_master_id": action_type}}, {"match": {[search_by]: searchParams.user_id}}, {"match": {"unit_id": searchParams.unit_id}}, {"range": {[search_date]:{gte: from, lte: to}}

      }
      ]
    }
  },
  "aggs": {
    "group": {
      "terms": {
        "field": "id",
        "size": item_per_page,
        "order": { "_key": sortdirction }

      },
    },
    "types_count": {
      "value_count": {
        "field": "id.keyword"
      }
    },
  },
};

1 Ответ

0 голосов
/ 31 октября 2019

Можно использовать следующие параметры: -

  1. Составное агрегирование : можно объединить несколько источников данных в одном ведре и разрешить разбивку на страницы и сортировку по ним. Он может выполнять линейное разбиение на страницы только с помощью after_key, т.е. вы не можете переходить со страницы 1 на страницу 3. Вы можете получить «n» записей, затем передать возвращенные после ключа и получить следующие «n» записи.
GET index22/_search
{
 "size": 0,
 "aggs": {
   "ValueCount": {
     "value_count": {
       "field": "id.keyword"
     }
   },
   "pagination": {
     "composite": {
       "size": 2,
       "sources": [
         {
           "TradeRef": {
             "terms": {
               "field": "id.keyword"
             }
           }
         }
       ]
     }
   }
 }
}
Включить раздел : группирует значения поля в число разделов во время запроса и обрабатывает только один раздел в каждом запросе. Термин поля равномерно распределен по разным разделам. Таким образом, вы должны знать количество терминов заранее. Вы можете использовать кардинальное агрегирование , чтобы получить счет
GET index22/_search
{
  "size": 0,
  "aggs": {
    "TradeRef": {
      "terms": {
        "field": "id.keyword",
        "include": {
          "partition": 0,
          "num_partitions": 3
        }
      }
    }
  }
}
Агрегация сортировки по группам : сортирует группы по родительским группам по совокупности. Каждый сегмент может быть отсортирован по его _key, _count или его подгруппам. Это относится только к сегментам, возвращенным из родительского агрегата. Вам нужно будет установить размер термина на 10 000 (максимальное значение) и усечь сегменты в bucket_sort. Вы можете разбивать на страницы, используя from и size, как в запросе. Если у вас есть термины, превышающие 10000, вы не сможете использовать его, поскольку он выбирает только те сегменты, которые возвращены термином.
GET index22/_search
{
  "size": 0,
  "aggs": {
    "valueCount":{
      "value_count": {
        "field": "TradeRef.keyword"
      }
    },
    "TradeRef": {
      "terms": {
        "field": "TradeRef.keyword",
        "size": 10000
      },
      "aggs": {
        "my_bucket": {
          "bucket_sort": {
            "sort": [
              {
                "_key": {
                  "order": "asc"
                }
              }
            ],
            "from": 2, 
            "size": 1
          }
        }
      }
    }
  }
}

С точки зрения производительности композитное агрегирование - лучший выбор

...