Spec-Zone.ru › Redis

FT.AGGREGATE

FT.AGGREGATE
Синтаксис
FT.AGGREGATE index query 
  [VERBATIM] 
  [ LOAD count field [field ...]] 
  [TIMEOUT timeout] 
  [LOAD *] 
  [ GROUPBY nargs property [property ...] [ REDUCE function nargs arg [arg ...] [AS name] [ REDUCE function nargs arg [arg ...] [AS name] ...]] 
  [ GROUPBY nargs property [property ...] [ REDUCE function nargs arg [arg ...] [AS name] [ REDUCE function nargs arg [arg ...] [AS name] ...]] ...]] 
  [ SORTBY nargs [ property ASC | DESC [ property ASC | DESC ...]] [MAX num]] 
  [ APPLY expression AS name [ APPLY expression AS name ...]] 
  [ LIMIT offset num] 
  [FILTER filter] 
  [ WITHCURSOR [COUNT read_size] [MAXIDLE idle_time]] 
  [ PARAMS nargs name value [ name value ...]] 
  [DIALECT dialect]
Доступно в:
Redis Stack / Поиск 1.1.0
Сложность по времени:
O(1)

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

Примеры

Обязательные аргументы

index

имя индекса, по которому выполняется запрос. Сначала необходимо создать индекс с помощью FT.CREATE.

query

базовый фильтрующий запрос, который извлекает документы. Он использует тот же самый синтаксис, что и запрос поиска, включая фильтры, объединения, не, необязательные и так далее.

Дополнительные аргументы

VERBATIM

если установлено, не пытается использовать стемминг для расширения запроса, а ищет термины запроса дословно.

LOAD {nargs} {identifier} AS {property} …

загружает атрибуты документов из исходного документа.

  • identifier — это имя атрибута для хешей и JSON или выражение JSON Path для JSON.
  • property — необязательное имя, используемое в результате. Если оно не указано, используется identifier. Это следует избегать.
  • Если * используется как nargs, загружаются все атрибуты документа.

Атрибуты, необходимые для агрегаций, должны храниться как SORTABLE, где они доступны в агрегирующей обработке с очень низкой задержкой. LOAD значительно снижает производительность агрегированных запросов, поскольку каждый обработанный записной элемент требует выполнения эквивалента HMGET по отношению к ключу Redis, что при выполнении над миллионами ключей приводит к высоким временам обработки.

GROUPBY {nargs} {property}

группирует результаты в обработке на основе одного или нескольких свойств. Каждая группа должна иметь как минимум один редуктор — функцию, которая обрабатывает записи группы, либо подсчитывая их, либо выполняя несколько агрегирующих операций (см. ниже).

REDUCE {func} {nargs} {arg} … [AS {name}]

сводит результаты сопоставления в каждой группе к одной записи, используя функцию сведения. Например, COUNT подсчитывает количество записей в группе. Редукторы могут иметь свои собственные имена свойств, используя необязательный аргумент AS {name}. Если имя не задано, результирующим именем будет имя функции сведения и свойства группы. Например, если имя не задано для COUNT_DISTINCT по свойству @foo, результирующим именем будет count_distinct(@foo).

См. Поддерживаемые редукторы GROUPBY для получения дополнительной информации.

SORTBY {nargs} {property} {ASC|DESC} [MAX {num}]

сортирует обработку до точки SORTBY, используя список свойств.

  • По умолчанию сортировка происходит по возрастанию, но можно добавить ASC или DESC для каждого свойства.
  • nargs — количество параметров сортировки, включая ASC и DESC, например, SORTBY 4 @foo ASC @bar DESC.
  • MAX используется для оптимизации сортировки, сортируя только n наибольших элементов. Хотя это не связано с LIMIT, для обычных запросов обычно достаточно SORTBY … MAX.

Атрибуты, необходимые для SORTBY, должны храниться как SORTABLE, чтобы быть доступными с очень низкой задержкой.

APPLY {expr} AS {name}

применяет преобразование 1:1 к одному или нескольким свойствам и либо сохраняет результат в качестве нового свойства в обработке, либо заменяет любое свойство с помощью этого преобразования.

expr — это выражение, которое может использоваться для выполнения арифметических операций над числовыми свойствами, функций, которые могут применяться к свойствам в зависимости от их типов (см. ниже), или любой комбинации из них. Например, APPLY "sqrt(@foo)/log(@bar) + 5" AS baz динамически оценивает это выражение для каждой записи в обработке и сохраняет результат в качестве нового свойства с именем baz, которое может быть использовано в последующих операциях APPLY/SORTBY/GROUPBY/REDUCE обработки.

LIMIT {offset} {num}

ограничивает количество возвращаемых результатов только num результатами, начиная с индекса offset (нумерация с нуля). Для ограничения выходных данных операции сортировки гораздо эффективнее использовать SORTBY … MAX. Если ключ истекает во время запроса, попытка получить значение ключа вернет пустой массив.

Однако, limit можно использовать для ограничения результатов без сортировки или для постраничного просмотра n-наибольших результатов, определяемых SORTBY MAX. Например, получение результатов 50-100 из 100 наилучших результатов выражается наиболее эффективно как SORTBY 1 @foo MAX 100 LIMIT 50 50. Удаление MAX из SORTBY приводит к сортировке всей обработки всех записей, а затем постраничному просмотру результатов 50-100.

FILTER {expr}

фильтрует результаты с помощью предикатных выражений, связанных со значениями в каждом результате. Они применяются после запроса и относятся к текущему состоянию обработки.

WITHCURSOR {COUNT} {read_size} [MAXIDLE {idle_time}]

Обрабатывает часть результатов с помощью более быстрого варианта, чем LIMIT. См. API курсора для получения дополнительной информации.

TIMEOUT {milliseconds}

если установлено, переопределяет параметр таймаута модуля.

PARAMS {nargs} {name} {value}

определяет один или несколько параметров значений. Каждый параметр имеет имя и значение.

Параметры в query можно ссылаться с помощью $, после которого следует имя параметра, например, $user. Каждая такая ссылка в запросе поиска на имя параметра заменяется соответствующим значением параметра. Например, с определением параметра PARAMS 4 lon 29.69465 lat 34.95126, выражение @loc:[$lon $lat 10 km] вычисляется в @loc:[29.69465 34.95126 10 km]. Параметры нельзя ссылаться в строке запроса, где конкретные значения недопустимы, например, в именах полей, например, @loc. Для использования PARAMS, установите DIALECT на 2 или больше 2.

DIALECT {dialect_version}

выбирает версию диалекта, в которой должен выполняться запрос. Если не указано, запрос будет выполнен в соответствии с установленной по умолчанию версией диалекта при загрузке модуля или с помощью команды FT.CONFIG SET.

Возврат

FT.AGGREGATE возвращает массивный ответ, где каждая строка — это массивный ответ и представляет собой отдельный результат агрегирования. Целочисленный ответ в позиции 1 не представляет действительного значения.

Возврат нескольких значений

См. Возврат нескольких значений в FT.SEARCH. DIALECT можно указать в качестве параметра в команде FT.AGGREGATE. Если он не указан, используется DEFAULT_DIALECT, который можно установить с помощью FT.CONFIG SET или передав его в качестве аргумента модулю redisearch при его загрузке. Например, с помощью следующего документа и индекса:

127.0.0.1:6379> JSON.SET doc:1 $ '[{"arr": [1, 2, 3]}, {"val": "hello"}, {"val": "world"}]'
OK
127.0.0.1:6379> FT.CREATE idx ON JSON PREFIX 1 doc: SCHEMA $..arr AS arr NUMERIC $..val AS val TEXT
OK

Обратите внимание на разные ответы с DIALECT 3 и без него:

127.0.0.1:6379> FT.AGGREGATE idx * LOAD 2 arr val 
1) (integer) 1
2) 1) "arr"
   2) "[1,2,3]"
   3) "val"
   4) "hello"
127.0.0.1:6379> FT.AGGREGATE idx * LOAD 2 arr val DIALECT 3
1) (integer) 1
2) 1) "arr"
   2) "[[1,2,3]]"
   3) "val"
   4) "[\"hello\",\"world\"]"

Сложность

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

Примеры

Сортировка посещений страниц по дням

Найти посещения страницы about.html, сгруппировать их по дню посещения, посчитать количество посещений и отсортировать их по дням.

FT.AGGREGATE idx "@url:\"about.html\""
    APPLY "day(@timestamp)" AS day
    GROUPBY 2 @day @country
      REDUCE count 0 AS num_visits
    SORTBY 4 @day
Поиск книг, наиболее часто публикуемых ежегодно

Поиск книг, чаще всего публикуемых в конкретном году.

FT.AGGREGATE books-idx *
    GROUPBY 1 @published_year
      REDUCE COUNT 0 AS num_published
    GROUPBY 0
      REDUCE MAX 1 @num_published AS max_books_published_per_year
Сведение всех результатов

В последнем примере использовался GROUPBY 0. Используйте GROUPBY 0 для применения функции REDUCE ко всем результатам с последней стадии агрегационной обработки — это работает как для начального запроса, так и для последующих операций GROUPBY.

Поиск библиотек в радиусе 10 километров от долготы -73.982254 и широты 40.753181, а затем их аннотирование расстоянием между их местоположением и этими координатами.

 FT.AGGREGATE libraries-idx "@location:[-73.982254 40.753181 10 km]"
    LOAD 1 @location
    APPLY "geodistance(@location, -73.982254, 40.753181)"

Здесь нам потребовалось использовать LOAD для предварительной загрузки атрибута @location, поскольку это атрибут GEO.

Далее, посчитать события GitHub по пользователям (акторам), чтобы определить наиболее активных пользователей.

127.0.0.1:6379> FT.AGGREGATE gh "*" GROUPBY 1 @actor REDUCE COUNT 0 AS num SORTBY 2 @num DESC MAX 10
 1) (integer) 284784
 2) 1) "actor"
    2) "lombiqbot"
    3) "num"
    4) "22197"
 3) 1) "actor"
    2) "codepipeline-test"
    3) "num"
    4) "17746"
 4) 1) "actor"
    2) "direwolf-github"
    3) "num"
    4) "10683"
 5) 1) "actor"
    2) "ogate"
    3) "num"
    4) "6449"
 6) 1) "actor"
    2) "openlocalizationtest"
    3) "num"
    4) "4759"
 7) 1) "actor"
    2) "digimatic"
    3) "num"
    4) "3809"
 8) 1) "actor"
    2) "gugod"
    3) "num"
    4) "3512"
 9) 1) "actor"
    2) "xdzou"
    3) "num"
    4) "3216"
[10](10)) 1) "actor"
    2) "opstest"
    3) "num"
    4) "2863"
11) 1) "actor"
    2) "jikker"
    3) "num"
    4) "2794"
(0.59s)

См. также

FT.CONFIG SET | FT.SEARCH

Связанные темы

  • Агрегации
  • RediSearch

© 2006–2022 Salvatore Sanfilippo
Licensed under the Creative Commons Attribution-ShareAlike License 4.0.
https://redis.io/commands/ft.aggregate/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API