Начало работы с клиентом Milvus JavaScript
Milvus — это надежная база данных с открытым исходным кодом для векторного поиска. Ее способность горизонтально масштабироваться практически под любую нагрузку делает ее лучшим выбором для развертываний машинного обучения. Она также включает инструменты лучшего в своем классе уровня, в том числе для клиентов JavaScript. В этой статье мы покажем, как начать работать с Milvus и JavaScript.
Milvus node.js SDK(Client) позволяет создавать гибкие и мощные возможности обработки данных прямо в вашей среде JavaScript. Он использует Node.js для подключения к серверу Milvus, предоставляя вам полный доступ ко всем операциям базы данных. Вы можете использовать клиент для создания коллекций, вставки данных, создания индексов, выполнения запросов и поиска и многого другого.
Мы начнем с настройки среды, необходимой для запуска кода, включая локальный экземпляр сервера. После того как все будет запущено, вы перейдете к подключению к базе данных Milvus. Этот базовый шаг гарантирует, что вы подключены к обширным ресурсам, которые предлагает Milvus.
Затем вы создадите коллекцию в Milvus. После настройки коллекции мы наконец перейдем к сути операций с данными: вставке и запросу данных.
Давайте начнем.
Предварительные требования
Прежде чем начать, вам понадобится установить несколько вещей в вашей системе разработки.
Для этого руководства мы будем использовать Milvus Lite, поэтому вам понадобится Python 3.8 или выше. Вам также понадобится Node.js версии 12 или выше, npm версии 12 или выше либо yarn для установки пакетов.
После того как вы все подготовите, давайте установим и запустим Milvus Lite и JavaScript Client.
Установка и запуск Milvus Lite
Лучшей практикой для запуска Python-приложений, таких как Milvus Lite, является использование виртуальной среды. Создайте среду, активируйте ее и обновите pip.
[egoebelbecker@ares examples]$ python3 -m venv ./venv
[egoebelbecker@ares examples]$ source venv/bin/activate
(venv) [egoebelbecker@ares examples]$ pip install --upgrade pip
Requirement already satisfied: pip in ./venv/lib64/python3.11/site-packages (22.3.1)
Collecting pip
Using cached pip-23.2-py3-none-any.whl (2.1 MB)
Installing collected packages: pip
Attempting uninstall: pip
Found existing installation: pip 22.3.1
Uninstalling pip-22.3.1:
Successfully uninstalled pip-22.3.1
Successfully installed pip-23.2
Затем установите библиотеку milvus из PyPi.
(venv) [egoebelbecker@ares examples]$ pip install milvus
Collecting milvus
Obtaining dependency information for milvus from https://files.pythonhosted.org/packages/c1/a6/599ba1f8615e6ec73208ab614f5daf7ab27097070fbbd1715a1b5cc5e578/milvus-2.2.11-py3-none-manylinux2014_x86_64.whl.metadata
Downloading milvus-2.2.11-py3-none-manylinux2014_x86_64.whl.metadata (6.7 kB)
Using cached milvus-2.2.11-py3-none-manylinux2014_x86_64.whl (51.7 MB)
Installing collected packages: milvus
Successfully installed milvus-2.2.11
(venv) [egoebelbecker@ares examples]$
Наконец, запустите ваш сервер.
(venv) [egoebelbecker@ares examples]$ milvus-server
__ _________ _ ____ ______
/ |/ / _/ /| | / / / / / __/
/ /|_/ // // /_| |/ / /_/ /\ \
/_/ /_/___/____/___/\____/___/ {Lite}
Welcome to use Milvus!
Version: v2.2.11-lite
Process: 505236
Started: 2023-07-20 14:18:37
Config: /home/egoebelbecker/.milvus.io/milvus-server/2.2.11/configs/milvus.yaml
Logs: /home/egoebelbecker/.milvus.io/milvus-server/2.2.11/logs
Ctrl+C to exit ...
Установка Milvus node.js SDK(Client)
Сначала инициализируйте npm в вашем рабочем каталоге.
[egoebelbecker@ares examples]$ npm init
[egoebelbecker@ares examples]$ npm install @zilliz/milvus2-sdk-node
Теперь вы готовы написать немного кода!
Начало работы с Milvus и JavaScript
После установки Milvus и JavaScript вы готовы запустить Milvus и JavaScript.
Подключение к Milvus
Вы можете подключаться к Milvus и взаимодействовать с ним через класс MilvusClient.
Milvus предлагает несколько вариантов подключения, таких как имя пользователя, пароль и адрес сервера. Поскольку вы используете Milvus Lite, вам нужно только указать, куда подключаться.
Создайте MilvusClient и проверьте поле connectStatus, чтобы убедиться, что он подключен:
import { MilvusClient } from '@zilliz/milvus2-sdk-node';
const milvusClient = new MilvusClient({
address: 'localhost:19530',
});
console.log("Connection status: " + milvusClient.connectStatus)
Вот вывод:
Connection status: 1
Создание базы данных
Ваш сервер пуст, поэтому начнем с создания базы данных.
Большинство вызовов Milvus Javascript API включают сетевой запрос, поэтому они возвращают promise. Также не гарантируется, что они выполнятся в том порядке, в котором вы перечислили их в коде, поэтому необходимо внимательно следить за временем выполнения и использовать такие инструменты, как цепочки promise, блоки кода и await, чтобы обеспечить выполнение функций в ожидаемом порядке.
Чтобы сделать код более удобным для чтения, я буду использовать отдельные блоки кода и выводить promise после его завершения. Я также буду использовать await, когда это необходимо, как «грубый» способ обеспечить выполнение кода в правильном порядке.
Для производственного кода вы, вероятно, использовали бы другой подход.
Этот код создает базу данных с помощью createDatabase, используя await, чтобы код не продолжал выполняться до завершения операции. Затем он проверяет наличие новой базы данных, вызывая listDatabases.
CreateDatabase требуется только имя базы данных.
import { MilvusClient } from '@zilliz/milvus2-sdk-node';
(async () => {
const milvusClient = new MilvusClient({
address: 'localhost:19530',
});
console.log("Connection status: " + milvusClient.connectStatus)
const createDb = await milvusClient.createDatabase({ db_name: 'my_db' });
console.log('Database is created', createDb);
const listDatabases = await milvusClient.listDatabases();
console.log('list databases', listDatabases);
})();
Результаты выглядят следующим образом:
Connection status: 1
Database is created { error_code: 'Success', reason: '' }
list databases {
db_names: [ 'my_db', 'default' ],
status: { error_code: 'Success', reason: '' }
}
Создание коллекции
Далее пора создать коллекцию, чтобы вы могли добавить в нее данные.
Перед тем как создать или использовать коллекцию, необходимо use базу данных, которая ее содержит. Поэтому после подключения этот скрипт uses my_db.
Затем он создает новую коллекцию с помощью createCollection и проверяет ее с помощью describeCollection. Для новой коллекции нужна схема с типами данных, поэтому необходимо импортировать DataType в скрипт.
import { MilvusClient, DataType } from '@zilliz/milvus2-sdk-node';
(async () => {
const milvusClient = new MilvusClient({
address: 'localhost:19530',
});
console.log('Connection status: ' + milvusClient.connectStatus);
await milvusClient.use({ db_name: 'my_db' });
const create = await milvusClient.createCollection({
collection_name: 'sample_collection',
fields: [
{
name: 'age',
description: 'Поле ID',
data_type: DataType.Int64,
is_primary_key: true,
autoID: true,
},
{
name: 'vector',
description: 'Векторное поле',
data_type: DataType.FloatVector,
dim: 8,
},
{ name: 'height', description: 'поле int64', data_type: DataType.Int64 },
{
name: 'name',
description: 'Поле VarChar',
data_type: DataType.VarChar,
max_length: 128,
},
],
});
console.log('Создание коллекции завершено.', create);
await milvusClient.describeCollection({ collection_name: 'sample_collection'});
console.log('описать коллекцию', describeCollection);
})();
Скрипт успешно выполняется с информацией о новой коллекции:
Connection status: 1
new Database is using { error_code: 'Success', reason: '' }
Create collection is finished. { error_code: 'Success', reason: '' }
describe collection {
virtual_channel_names: [ 'by-dev-rootcoord-dml_1_443014985196255045v0' ],
physical_channel_names: [ 'by-dev-rootcoord-dml_1' ],
aliases: [],
start_positions: [],
properties: [],
status: { error_code: 'Success', reason: '' },
schema: {
fields: [ [Object], [Object], [Object], [Object] ],
name: 'sample_collection',
description: '',
autoID: false,
enable_dynamic_field: false
},
collectionID: '443014985196255045',
created_timestamp: '443015720996700166',
created_utc_timestamp: '1689970859515',
shards_num: 1,
consistency_level: 'Bounded',
collection_name: 'sample_collection',
db_name: 'my_db',
num_partitions: '1'
}
Добавление и получение данных
Теперь пора добавить в коллекцию немного данных.
Сначала нам нужны данные. Обычно ваш код считывает или собирает данные откуда-либо, но здесь вы будете использовать несколько жестко заданных значений.
После объявления массива значений этот скрипт использует InsertReq, чтобы вставить его по имени в новую коллекцию:
import { MilvusClient, InsertReq } from '@zilliz/milvus2-sdk-node';
(async () => {
const milvusClient = new MilvusClient({
address: 'localhost:19530',
});
console.log('Connection status: ' + milvusClient.connectStatus);
const useDb = await milvusClient.use({ db_name: 'my_db' });
console.log('new Database is using', useDb);
const vectorsData = [
{
vector: [
0.11878310581111173, 0.9694947902934701, 0.16443679307243175,
0.5484226189097237, 0.9839246709011924, 0.5178387104937776,
0.8716926129208069, 0.5616972243831446,
],
height: 20405,
name: 'zlnmh',
},
{
vector: [
0.9992090731236536, 0.8248790611809487, 0.8660083940881405,
0.09946359318481224, 0.6790698063908669, 0.5013786801063624,
0.795311915725105, 0.9183033261617566,
],
height: 93773,
name: '5lr9y',
},
{
vector: [
0.8761291569818763, 0.07127366044153227, 0.775648976160332,
0.5619757601304878, 0.6076543120476996, 0.8373907516027586,
0.8556140171597648, 0.4043893119391049,
],
height: 85122,
name: 'nes0j',
},
{
vector: [
0.5849602436079879, 0.5108258101682586, 0.8250884731578105,
0.7996354835509332, 0.8207766774911736, 0.38133662902290566,
0.7576720055508186, 0.4393152967662368,
],
height: 92037,
name: 'ct2li',
},
{
vector: [
0.3768133716738886, 0.3823259261020866, 0.7906232829855262,
0.31693696726284193, 0.3731715403499176, 0.3300751870649885,
0.22353556137796238, 0.38062799545615444,
],
height: 31400,
name: '6ghrg',
},
{
vector: [
0.0007531778212483964, 0.12941566118774994, 0.9340164428788116,
0.3795768837758642, 0.4532443258064389, 0.596455163143,
0.9529469158782906, 0.7692465408044873,
],
height: 1778,
name: 'sb7mt',
},
];
const params: InsertReq = {
collection_name: 'sample_collection',
fields_data: vectorsData,
};
// insert data into collection
const insert = await milvusClient.insert(params);
console.log('Inserted data:', insert);
})();
API возвращает информацию о том, что вы вставили:
Connection status: 1
new Database is using { error_code: 'Success', reason: '' }
Inserted data: {
succ_index: [ 0, 1, 2, 3, 4, 5 ],
err_index: [],
status: { error_code: 'Success', reason: '' },
IDs: { int_id: { data: [Array] }, id_field: 'int_id' },
acknowledged: false,
insert_cnt: '6',
delete_cnt: '0',
upsert_cnt: '0',
timestamp: '443015922585698312'
}
Теперь у вас есть данные для запроса. Но прежде чем запускать запросы в production, вы, вероятно, добавили бы индекс в свою коллекцию. Это добавляет индекс для поля vector:
const createIndex = await milvusClient.createIndex({
collection_name: 'sample_collection',
field_name: 'vector',
metric_type: 'L2',
});
Чтобы выполнить этот код, вашему скрипту по-прежнему нужно подключиться и использовать связанную базу данных.
Наконец, вы можете выполнить запрос, написанный в любом выражении или запросе, поддерживаемом Milvus. В этом примере он просто фильтрует элементы по возрасту.
import { MilvusClient } from '@zilliz/milvus2-sdk-node';
(async () => {
const milvusClient = new MilvusClient({
address: 'localhost:19530',
});
const useDb = await milvusClient.use({ db_name: 'my_db' });
console.log('new Database is using', useDb);
const load = await milvusClient.loadCollectionSync({ collection_name: 'sample_collection' });
const query = await milvusClient.query({
collection_name: 'sample_collection',
filter: 'age > 0',
output_fields: ['age', 'vector'],
limit: 100,
});
console.log('query result', query);
})();
Вот результат:
new Database is using { error_code: 'Success', reason: '' }
Query time: 235.806ms
query result {
status: { error_code: 'Success', reason: '' },
data: [
{ vector: [Array], age: '443014985196258910' },
{ vector: [Array], age: '443014985196258911' },
{ vector: [Array], age: '443014985196258912' },
{ vector: [Array], age: '443014985196258913' },
{ vector: [Array], age: '443014985196258914' },
{ vector: [Array], age: '443014985196258915' }
]
}
Поиск векторов
После того как ваша коллекция загружена в память, вы можете выполнить по ней поиск по векторному сходству.
import { MilvusClient } from '@zilliz/milvus2-sdk-node';
(async () => {
const milvusClient = new MilvusClient({
address: 'localhost:19530',
});
const useDb = await milvusClient.use({ db_name: 'my_db' });
console.log('new Database is using', useDb);
const load = await milvusClient.loadCollectionSync({ collection_name: 'sample_collection' });
const query = await milvusClient.search({
collection_name: 'sample_collection',
vector: [1,2,3,4,5,6,7,8],
filter: 'age > 0',
output_fields: ['id', 'age'],
limit: 5,
});
console.log('query result', query);
})();
Вот результат:
Search result {
status: { error_code: 'Success', reason: '' },
results: [
{ score: 0, id: '442936641561652921', age: '442936641561652921' },
{
score: 1.0004949569702148,
id: '442936641561652924',
age: '442936641561652924'
},
{
score: 1.6779069900512695,
id: '442936641561652926',
age: '442936641561652926'
},
{
score: 1.7160398960113525,
id: '442936641561652922',
age: '442936641561652922'
},
{
score: 1.718210220336914,
id: '442936641561652925',
age: '442936641561652925'
}
]
}
Резюме
Мы настроили среду разработки для работы с Milvus и Milvus JavaScript. Мы подключились к серверу, создали базу данных и коллекцию, вставили данные и извлекли их, а также выполнили поиски по векторному сходству. Как вы видели, работать с векторными данными в JavaScript с Milvus проще простого!
Добавьте возможности векторного поиска в свои веб-приложения уже сегодня! А заодно взгляните на бесплатную пробную версию Zilliz Cloud и узнайте, как можно за считанные минуты запустить готовый к облаку, надежный и высокопроизводительный кластер Milvus.
Об авторе
Этот пост был написан Эриком Гёбельбекером. Эрик 25 лет работал на финансовых рынках Нью-Йорка, разрабатывая инфраструктуру для рыночных данных и сетей протокола обмена финансовой информацией (FIX). Он любит говорить о том, что делает команды эффективными (или не такими эффективными!).
Читать далее

Vector Lakebase: End the AI Data Silo
Learn how Vector Lakebase unifies vector search, data lakes, and AI data operations so teams can serve RAG and agents without copy-and-sync pipelines.

A Developer's Guide to Exploring Milvus 2.6 Features on Zilliz Cloud
Milvus 2.6 marks a shift from “vector search + glue code” to a more advanced retrieval engine, and it is now Generally Available (GA) on Zilliz Cloud (a managed Milvus service).

Why Context Engineering Is Becoming the Full Stack of AI Agents
Discover how context engineering unifies prompts, RAG, and tools to build smarter, production-ready AI agents powered by Milvus.



