Операторы ARRAY
Milvus предоставляет операторы ARRAY для фильтрации полей ARRAY и частичного обновления значений полей ARRAY.
Все элементы массива должны быть одного типа, а вложенные структуры внутри массивов обрабатываются как простые строки. Поэтому при работе с полями ARRAY рекомендуется избегать чрезмерно глубокого вложения и стремиться к тому, чтобы структуры данных были максимально плоскими для обеспечения оптимальной производительности.
Операторы ARRAY в Milvus охватывают два сценария использования:
Выражения фильтрации для запросов и поиска.
Частичное обновление в запросах типа «
upsert».
Доступные операторы ARRAY
В следующей таблице перечислены операторы ARRAY, доступные в Milvus.
| Оператор | Использование в | Описание |
|---|---|---|
| ARRAY_CONTAINS(идентификатор, выражение) | Выражение фильтра | Проверяет, существует ли конкретный элемент в поле ARRAY. |
| ARRAY_CONTAINS_ALL(идентификатор, выражение) | Фильтрующее выражение | Проверяет, присутствуют ли все элементы указанного списка в поле ARRAY. |
| ARRAY_CONTAINS_ANY(идентификатор, выражение) | Фильтрующее выражение | Проверяет, присутствует ли хотя бы один элемент из указанного списка в поле ARRAY. |
| ARRAY_LENGTH(идентификатор) | Фильтрующее выражение | Возвращает количество элементов в поле ARRAY; может использоваться в сочетании с операторами сравнения для фильтрации. |
| ARRAY_APPEND | upsert with field_ops | Добавляет элементы полезных данных к существующему полю ARRAY. Доступно в Milvus версии 2.6.17 и более поздних. |
| ARRAY_REMOVE | upsert с field_ops | Удаляет из существующего поля ARRAY все элементы, которые соответствуют значению в полезных данных запроса. Доступно в Milvus версии 2.6.17 и выше. |
ARRAY_CONTAINS
Оператор « ARRAY_CONTAINS » проверяет наличие конкретного элемента в поле типа «array». Это полезно, когда требуется найти сущности, в массиве которых присутствует заданный элемент.
Пример
Предположим, у вас есть поле типа «массив» history_temperatures, содержащее зафиксированные минимальные температуры за разные годы. Чтобы найти все сущности, в массиве которых содержится значение 23, можно использовать следующее выражение фильтра:
filter = 'ARRAY_CONTAINS(history_temperatures, 23)'
Это вернёт все сущности, в массиве которых history_temperatures содержится значение 23.
ARRAY_CONTAINS_ALL
Оператор ARRAY_CONTAINS_ALL гарантирует, что все элементы указанного списка присутствуют в поле массива. Этот оператор полезен, когда требуется найти сущности, содержащие несколько значений в массиве.
Пример
Если необходимо найти все сущности, в массиве которых history_temperatures содержатся как 23, так и 24, можно использовать:
filter = 'ARRAY_CONTAINS_ALL(history_temperatures, [23, 24])'
Это вернёт все сущности, в массиве которых history_temperatures содержатся оба указанных значения.
ARRAY_CONTAINS_ANY
Оператор ` ARRAY_CONTAINS_ANY ` проверяет, присутствует ли в поле массива хотя бы один из элементов указанного списка. Это полезно, когда требуется найти сущности, содержащие хотя бы одно из указанных значений в массиве.
Пример
Чтобы найти все сущности, в массиве которых history_temperatures содержится либо 23, либо 24, можно использовать:
filter = 'ARRAY_CONTAINS_ANY(history_temperatures, [23, 24])'
Это вернёт все сущности, в массиве которых history_temperatures содержится хотя бы одно из значений: 23 или 24.
ARRAY_LENGTH
Функция ARRAY_LENGTH возвращает длину (количество элементов) массивного поля. Она принимает ровно один параметр: идентификатор массивного поля.
Пример
Чтобы найти все сущности, у которых массив history_temperatures содержит менее 10 элементов:
filter = 'ARRAY_LENGTH(history_temperatures) < 10'
Это вернёт все сущности, у которых массив history_temperatures содержит менее 10 элементов.
ARRAY_APPENDCompatible with Milvus 2.6.17+
Оператор ` ARRAY_APPEND ` добавляет элементы полезных данных к существующему полю `ARRAY` во время запроса ` upsert `. Это не выражение фильтра. Используйте его, если хотите добавить значения в массив, не запрашивая сначала текущее значение массива.
В следующем примере на языке Python оператор ` "premium" ` добавляется к полю `ARRAY` при выполнении запроса ` tags ` для сущности, первичный ключ которой — ` 1`:
from pymilvus import FieldOp, MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus"
)
client.upsert(
collection_name="users",
data=[{"pk": 1, "tags": ["premium"]}],
field_ops={"tags": FieldOp.array_append()},
)
Добавление ARRAY_APPEND к полю с помощью field_ops включает семантику частичного обновления для этого поля. Полную информацию о рабочем процессе, поддерживаемых типах элементов и ограничениях см. в разделе «Поля ARRAY с оператором Upsert в режиме слияния».
ARRAY_REMOVECompatible with Milvus 2.6.17+
Оператор ` ARRAY_REMOVE ` удаляет из существующего поля типа `ARRAY` все элементы, которые соответствуют значению в полезной нагрузке запроса, во время выполнения запроса ` upsert `. Это не выражение фильтра. Используйте его, если необходимо удалить соответствующие значения из массива без предварительного запроса текущего значения массива.
В следующем примере на языке Python удаляются элементы, соответствующие выражению "trial", из поля ARRAY с помощью операции « tags » для сущности, первичный ключ которой — 1:
from pymilvus import FieldOp, MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus"
)
client.upsert(
collection_name="users",
data=[{"pk": 1, "tags": ["trial"]}],
field_ops={"tags": FieldOp.array_remove()},
)
Привязка ARRAY_REMOVE к полю с помощью field_ops включает семантику частичного обновления для этого поля. Полную информацию о рабочем процессе, поддерживаемых типах элементов и ограничениях см. в разделе «Поля ARRAY с операцией Upsert в режиме слияния».