Вставка сущностей
Этот раздел описывает, как вставлять данные в Milvus через клиентскую часть.
Вы также можете использовать MilvusDM для миграции данных в Milvus. MilvusDM - это инструмент с открытым исходным кодом, специально разработанный для импорта и экспорта данных Milvus.
Milvus 2.1 поддерживает тип данных VARCHAR
для скалярных полей. При построении индекса для скалярного поля типа VARCHAR тип индекса по умолчанию - trie.
В следующем примере вставляются 2000 строк случайно сгенерированных данных в качестве образца (пример использования Milvus CLI использует заранее подготовленный удаленный CSV-файл с аналогичными данными). В приложениях реального мира часто используются векторы более высокой размерности, чем в примере. Вы можете подготовить свои собственные данные для замены образцовых данных.
Подготовка данных
Сначала подготовьте данные для вставки. Тип данных, который будет вставлен, должен соответствовать схеме коллекции, в противном случае Milvus вызовет исключение.
Milvus поддерживает значения по умолчанию для скалярных полей, за исключением полей первичного ключа. Это означает, что во время вставки или обновления данных некоторые поля можно оставить пустыми. Дополнительную информацию можно найти в разделе Создание коллекции.
После включения динамической схемы вы можете добавлять динамические поля к данным. Более подробную информацию см. в разделе Динамическая схема.
import random
data = [
[i for i in range(2000)],
[str(i) for i in range(2000)],
[i for i in range(10000, 12000)],
[[random.random() for _ in range(2)] for _ in range(2000)],
[],
None,
]
data.append([str("dy"*i) for i in range(2000)])
Вставка данных в Milvus
Вставьте данные в коллекцию.
Указав partition_name
, вы можете выбрать, в какое разделение вставить данные.
from pymilvus import Collection
collection = Collection("book") # Получите существующую коллекцию.
mr = collection.insert(data)
Параметр | Описание |
---|---|
data |
Данные, которые будут вставлены в Milvus. |
partition_name (опционально) |
Имя раздела, в который будут вставлены данные. |
После вставки сущностей в ранее проиндексированную коллекцию нет необходимости заново индексировать коллекцию, поскольку Milvus автоматически создаст индексы для вновь вставленных данных. Дополнительную информацию можно найти в разделе Можно ли создавать индексы после вставки векторов?
Обновление данных в Milvus
При вставке данных в Milvus они вставляются в сегменты. Для того чтобы сегменты были запечатаны и проиндексированы, им необходимо достичь определенного размера. Незапечатанные сегменты будут использовать метод грубого поиска. Чтобы избежать этой ситуации, рекомендуется вызывать flush()
для любых оставшихся данных. Вызов flush()
запечатает любые оставшиеся сегменты и отправит их в индекс. Важно вызывать этот метод только в конце сеанса вставки. Слишком частый вызов этого метода может привести к фрагментации данных, которую позже придется очищать.
Ограничения
Функция | Максимальный предел |
---|---|
Размерность вектора | 32,768 |
Обновление сущности
Обновление upsert - это комбинация операций вставки и удаления. В контексте векторной базы данных Milvus обновление - это операция на уровне данных. Она перезаписывает существующую сущность, если указанное поле существует в коллекции, и вставляет новую сущность, если указанное значение не существует.
В следующем примере обновляются 3,000 строк случайно сгенерированных данных в качестве образца. При выполнении операции обновления важно отметить, что эта операция может повлиять на производительность, поскольку она включает в себя удаление данных.
Подготовка данных
Сначала подготовьте данные для обновления. Тип данных, который будет обновлен, должен соответствовать схеме коллекции, в противном случае Milvus вызовет исключение.
Milvus поддерживает значения по умолчанию для скалярных полей, за исключением полей первичного ключа. Это означает, что во время вставки или обновления данных некоторые поля можно оставить пустыми. Дополнительную информацию можно найти в разделе создания коллекций.
import random
nb = 3000
dim = 8
vectors = [[random.random() for _ in range(dim)] for _ in range(nb)]
data = [
[i for i in range(nb)],
[str(i) for i in range(nb)],
[i for i in range(10000, 10000+nb)],
vectors,
[str("dy"*i) for i in range(nb)]
]
Обновление данных
Обновите данные в коллекции.
from pymilvus import Collection
collection = Collection("book") # Получите существующую коллекцию.
mr = collection.upsert(data)
Удаление сущности
Milvus поддерживает удаление сущностей с использованием логических выражений через первичные ключи.
Подготовка булевого выражения
Подготовьте булево выражение для фильтрации сущностей, которые нужно удалить.
Milvus поддерживает удаление только сущностей с явно указанными первичными ключами, что можно сделать с помощью оператора "in". Другие операторы могут использоваться только для скалярной фильтрации при запросах или векторном поиске.
В следующем примере данные фильтруются с использованием значений первичных ключей 0 и 1.
expr = "book_id in [0,1]"
Подобно оператору WHERE в SQL
Удаление сущности
Используйте созданное вами булево выражение для удаления сущностей. Milvus вернет список идентификаторов удаленных сущностей.
from pymilvus import Collection
collection = Collection("book") # Получить существующую коллекцию.
collection.delete(expr)
Сжатие данных
Milvus поддерживает автоматическое сжатие данных по умолчанию. Вы можете настроить Milvus для включения или отключения сжатия и автоматического сжатия.
Если автоматическое сжатие отключено, вы все равно можете вручную сжимать данные.
Вручную сжать данные
Поскольку сжатие обычно занимает много времени, запросы на сжатие обрабатываются асинхронно.
from pymilvus import Collection
collection = Collection("book") # Получить существующую коллекцию.
collection.compact()
Проверить состояние сжатия
Вы можете использовать идентификатор сжатия, возвращенный при запуске вручного сжатия, чтобы проверить его состояние.
collection.get_compaction_state()