Вставка сущностей

Эта тема описывает, как вставлять данные в Milvus с клиентской стороны.

Вы также можете использовать MilvusDM для миграции данных в Milvus. MilvusDM - это инструмент с открытым исходным кодом, специально разработанный для импорта и экспорта данных с Milvus.

Milvus 2.1 поддерживает тип данных VARCHAR для скалярных полей. При построении индекса для скалярного поля типа VARCHAR тип индекса по умолчанию - trie.

В следующем примере вставляются 2 000 строк случайно сгенерированных данных в качестве образцов данных (пример использования Milvus CLI предполагает заранее подготовленный удаленный CSV-файл, содержащий аналогичные данные). В реальных приложениях могут использоваться векторы более высокой размерности, чем в примере. Вы можете подготовить свои собственные данные для замены данного примера.

Подготовка данных

Сначала подготовьте данные для вставки. Тип данных для вставки должен соответствовать схеме коллекции, в противном случае Milvus выдаст исключение.

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

После включения динамической схемы вы можете добавлять динамические поля к данным. За дополнительной информацией обратитесь к динамической схеме.

bookIDs := make([]int64, 0, 2000)
wordCounts := make([]int64, 0, 2000)
bookIntros := make([][]float32, 0, 2000)
for i := 0; i < 2000; i++ {
	bookIDs = append(bookIDs, int64(i))
	wordCounts = append(wordCounts, int64(i+10000))
	v := make([]float32, 0, 2)
	for j := 0; j < 2; j++ {
		v = append(v, rand.Float32())
	}
	bookIntros = append(bookIntros, v)
}
idColumn := entity.NewColumnInt64("book_id", bookIDs)
wordColumn := entity.NewColumnInt64("word_count", wordCounts)
introColumn := entity.NewColumnFloatVector("book_intro", 2, bookIntros)

Вставка данных в Milvus

Вставьте данные в коллекцию.

Указав partition_name, вы можете выбрать, в какой раздел вставить данные.

_, err = milvusClient.Insert(
	context.Background(), // ctx
	"book",               // CollectionName
	"",                   // partitionName
	idColumn,             // columnarData
	wordColumn,           // columnarData
	introColumn,          // columnarData
)
if err != nil {
	log.Fatal("не удалось вставить данные:", err.Error())
}
Параметр Описание
ctx Контекст, используемый для управления процессом вызова API.
CollectionName Название коллекции, в которую вставляются данные.
partitionName Название раздела, в который вставляются данные. Если оставить пустым, данные будут вставлены в раздел по умолчанию.
columnarData Данные, вставляемые в каждое поле.

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

Обновление данных в Milvus

Когда данные вставляются в Milvus, они вставляются в сегменты. Сегменты должны достигнуть определенного размера, чтобы быть запечатанными и проиндексированными. Незапечатанные сегменты будут запрашиваться через метод грубого поиска. Чтобы избежать этой ситуации, лучше вызвать flush(). Метод flush() запечатывает все оставшиеся сегменты и отправляет их в индекс. Очень важно вызывать этот метод только по окончании сеанса вставки. Чрезмерное вызывание этого метода может привести к фрагментации данных, которую придется впоследствии очищать.

Ограничения

Функция Максимальный предел
Размер вектора 32,768

Обновление данных

Подготовка данных

Сначала подготовьте данные для обновления. Тип данных, который должен быть обновлен, должен соответствовать схеме коллекции, в противном случае Milvus выдаст исключение.

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

nEntities := 3000
dim := 8
idList := make([]int64, 0, nEntities)
randomList := make([]float64, 0, nEntities)
embeddingList := make([][]float32, 0, nEntities)

for i := 0; i < nEntities; i++ {
    idList = append(idList, int64(i))
}

for i := 0; i < nEntities; i++ {
    randomList = append(randomList, rand.Float64())
}

for i := 0; i < nEntities; i++ {
    vec := make([]float32, 0, dim)
    for j := 0; j < dim; j++ {
        vec = append(vec, rand.Float32())
    }
    embeddingList = append(embeddingList, vec)
}
idColData := entity.NewColumnInt64("ID", idList)
randomColData := entity.NewColumnDouble("random", randomList)
embeddingColData := entity.NewColumnFloatVector("embeddings", dim, embeddingList)

Обновление данных

Обновите данные в коллекции.

if _, err := c.Upsert(ctx, collectionName, "", idColData, embeddingColData);
err != nil {
    log.Fatalf("не удалось обновить данные, ошибка: %v", err)
}