MilvusのJavaScriptクライアントを使い始める

Milvusは、ベクター検索用の堅牢なオープンソースデータベースである。ほぼすべての負荷に対して水平方向に拡張できるため、機械学習のデプロイメントに最適です。また、JavaScriptクライアントを含め、クラス最高のツールを備えている。この投稿では、MilvusとJavaScriptを使い始める方法を紹介する。
Milvus node.js SDK(Client)](https://github.com/milvus-io/milvus-sdk-node)を使用すると、柔軟で強力なデータ処理機能をJavaScript環境に組み込むことができます。Node.js](https://nodejs.org/en/download)を使用してMilvusサーバに接続し、すべてのデータベース操作に完全にアクセスすることができます。クライアントを使用して、コレクションの作成、データの挿入、インデックスの作成、クエリと検索の実行などを行うことができます。
まず、ローカルサーバインスタンスなど、コードを実行するのに必要な環境をセットアップすることから始めます。起動が完了したら、Milvusデータベースへの接続に移ります。この基本的なステップにより、Milvusが提供する膨大なリソースに確実に接続できるようになります。
次に、Milvusでコレクションを作成します。コレクションのセットアップが完了したら、いよいよデータ操作の中心であるデータの挿入とクエリに入ります。
それでは始めましょう。
前提条件
始める前に、開発システムにいくつかのものをインストールしておく必要があります。
このチュートリアルではMilvus Liteを使用しますので、Python 3.8以上が必要です。また、パッケージをインストールするために、Node.jsバージョン12以上、npmバージョン12以上、またはyarnが必要です。
すべての準備が整ったら、Milvus LiteとJavaScriptクライアントをインストールして実行してみましょう。
Milvus Liteのインストールと実行
Milvus LiteのようなPythonアプリケーションを実行するためのベストプラクティスは仮想環境を使うことです。環境を作成し、ソースを作成し、pip をアップグレードしてください。
[egoebelbecker@ares examples]$ python3 -m venv ./venv
[egoebelbecker@ares examples]$ source venv/bin/activate
(venv) [egoebelbecker@ares examples]$ pip install --upgrade pip
既に必要条件を満たしています: pip in ./venv/lib64/python3.11/site-packages (22.3.1)
pip の収集
キャッシュされた pip-23.2-py3-none-any.whl (2.1 MB) を使用します。
収集したパッケージのインストール: pip
アンインストール中: pip
既存のインストールが見つかりました: pip 22.3.1
pip-22.3.1をアンインストールしています:
pip-22.3.1 のアンインストールに成功しました。
pip-23.2 のインストールに成功しました。
次に、PyPiからmilvusライブラリをインストールする。
(venv) [egoebelbecker@ares examples]$ pip install milvus
milvusの収集
https://files.pythonhosted.org/packages/c1/a6/599ba1f8615e6ec73208ab614f5daf7ab27097070fbbd1715a1b5cc5e578/milvus-2.2.11-py3-none-manylinux2014_x86_64.whl.metadata から milvus の依存情報を取得する。
milvus-2.2.11-py3-none-manylinux2014_x86_64.whl.metadataのダウンロード (6.7 kB)
キャッシュされた milvus-2.2.11-py3-none-manylinux2014_x86_64.whl (51.7 MB) の使用
収集したパッケージのインストール: milvus
milvus-2.2.11 のインストールに成功した。
(venv) [egoebelbecker@ares examples]$
最後に、サーバーを実行する。
(venv) [egoebelbecker@ares examples]$ milvus-server
/ |/ / _/ /| | / / / / / __/
/ /|_/ // // /_| |/ / /_/ /\ \
/_/ /_/___/____/___/____/___/ {ライト}
Milvusをご利用いただきありがとうございます!
バージョン: v2.2.11-lite
プロセス 505236
開始 2023-07-20 14:18:37
コンフィグ /home/egoebelbecker/.milvus.io/milvus-server/2.2.11/configs/milvus.yaml
ログ /ホーム/egoebelbecker/.milvus.io/milvus-server/2.2.11/logs
Ctrl+C で終了 ...
Milvus node.js SDK(クライアント)のインストール
まず、作業ディレクトリで npm を初期化します。
[egoebelbecker@ares examples]$ npm init
[egoebelbecker@ares examples]$ npm install @zilliz/milvus2-sdk-node
これでコードを書く準備ができた!
MilvusとJavaScriptを始めよう
MilvusとJavaScriptをインストールしたら、MilvusとJavaScriptを実行する準備ができました。
Milvus への接続
MilvusClient](https://milvus.io/api-reference/node/v2.2.x/Client/MilvusClient.md)クラスを利用してMilvusに接続し、通信を行うことができます。
Milvusには、ユーザ名、パスワード、サーバアドレスなどの接続オプションがあります。ここではMilvus Liteを使用しているので、接続先を指定するだけです。
MilvusClientを作成し、connectStatus**フィールドをチェックして接続されていることを確認します:
import { MilvusClient } from '@zilliz/milvus2-sdk-node';
const milvusClient = new MilvusClient({
アドレス:localhost:19530'、
});
console.log("接続ステータス: " + milvusClient.connectStatus)
これが出力だ:
接続ステータス:1
データベースを作成する
サーバーは空なので、データベースを作成することから始めよう。
ほとんどのMilvus Javascript APIコールはネットワークリクエストを含むため、プロミスを返します。そのため、プロミスの連鎖、コードブロック、awaitなどのツールを使って、タイミングに注意しながら、期待する順番で関数が実行されるようにする必要があります。
コードを読みやすくするために、個々のコードブロックを使い、それが完了したらプロミスを表示することにする。また、コードが正しい順序で実行されるようにするための "総当たり "アプローチとして、必要に応じてawaitも使います。
本番コードでは、おそらく別のアプローチを使うだろう。
このコードでは、createDatabaseでデータベースを作成し、awaitを使用して、完了するまでコードを進めないようにしています。次に、listDatabasesを呼び出して、新しいデータベースが存在することを確認します。
CreateDatabaseはデータベース名だけを必要とする。
import { MilvusClient } from '@zilliz/milvus2-sdk-node';
(async () => {
const milvusClient = new MilvusClient({
address:localhost:19530'、
});
console.log("接続ステータス: " + 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);
})();
結果は以下の通りである:
接続ステータス1
データベースが作成された { error_code:'Success', reason: '' }.
リストデータベース {
db_names: [ 'my_db', 'default' ]、
status:{error_code:'Success', reason: '' }.
}
コレクションの作成
次に、コレクションを作成して、そこにデータを追加できるようにします。
コレクションを作成または使用する前に、そのコレクションを含むデータベースを 使用 する必要があります。したがって、接続後、このスクリプトは 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'、
説明: 'IDフィールド'、
data_type:DataType.Int64、
is_primary_key: true、
autoID: true、
},
{
name: 'vector'、
説明: 'ベクトルフィールド'、
data_type:DataType.FloatVector、
dim: 8、
},
{ name: 'height', description: 'int64 フィールド', data_type:DataType.Int64 }、
{
name: 'name'、
説明: 'VarChar フィールド'、
data_type:DataType.VarChar、
max_length: 128、
},
],
});
console.log('Create collection is finished.', create);
await milvusClient.describeCollection({ collection_name: 'sample_collection'});
console.log('describe collection', describeCollection);
})();
スクリプトは新しいコレクションに関する情報で成功する:
接続ステータス1
新しいデータベースは { error_code:'Success', reason: '' } を使用しています。
コレクションの作成が終了しました。{ error_code:'成功', 理由: '' }.
コレクションを記述する
virtual_channel_names: [ 'by-dev-rootcoord-dml_1_443014985196255045v0' ]、
physical_channel_names: [ 'by-dev-rootcoord-dml_1' ]、
aliases:[],
start_positions:[],
プロパティ[],
status:{ error_code:'Success', reason: '' }、
schema:{
fields:[オブジェクト], [オブジェクト], [オブジェクト], [オブジェクト]、
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'、
コレクション名: 'sample_collection'、
db_name: 'my_db'、
num_partitions:'1'
}
データの追加と取得
それでは、コレクションにデータを追加しましょう。
まず、データが必要です。通常、コードはどこからかデータを読み込んだり、組み立てたりしますが、ここではハードコードされた値を使用します。
値の配列を宣言した後、このスクリプトは InsertReq を使用して、新しいコレクションに名前を付けて insert します:
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,
],
高さ: 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、
};
// コレクションにデータを挿入
const insert = await milvusClient.insert(params);
console.log('Inserted data:', insert);
})();
APIは、挿入した内容に関する情報を返す:
接続ステータス:1
新しいデータベースは { error_code:'Success', reason: '' } を使用しています。
挿入されたデータ:{
succ_index:[ 0, 1, 2, 3, 4, 5 ],
err_index:[],
status:{ error_code:'Success', reason: '' }、
IDs:{ int_id:{ data:[Array] }, id_field: 'int_id' }、
認められる:false、
insert_cnt: '6'、
delete_cnt: '0'、
upsert_cnt: '0'、
timestamp:'443015922585698312'
}
これで、クエリを実行するデータができました。しかし、実運用でクエリを実行する前に、おそらくコレクションにインデックスを追加することでしょう。これは 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: '' } を使用しています。
クエリー時間:235.806ms
クエリー結果
ステータスエラーコード:{ error_code:'Success', reason: '' }、
データ[
{ vector:[Array], age: '443014985196258910' }、
{ vector:[Array], age: '443014985196258911' }、
{ vector:[Array], age: '443014985196258912' }、
{ vector:[Array], age: '443014985196258913' }、
{ vector:[Array], age: '443014985196258914' }、
{ vector:Array], age: '443014985196258915' }, { 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' });
コンストクエリ = 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);
})();
これがその結果だ:
検索結果
ステータス{ error_code:'Success', reason: '' }、
結果[
{ score: 0, id: '442936641561652921', age: '442936641561652921' }、
{
score: 1.0004949569702148、
id: '442936641561652924'、
年齢: '442936641561652924'
},
{
score: 1.6779069900512695、
id: '442936641561652926'、
年齢: '442936641561652926'.
},
{
score: 1.7160398960113525、
id: '442936641561652922'、
年齢: '442936641561652922'.
},
{
score: 1.718210220336914、
id: '442936641561652925'、
age: '442936641561652925'.
}
]
}
まとめ
MilvusとMilvus JavaScriptの開発環境を構築した。サーバに接続し、データベースとコレクションを作成し、データを挿入し、取得し、類似ベクトル検索を実行しました。ご覧いただいたように、Milvusを使ってJavaScriptでベクトルデータを扱うことはこれ以上ないほど簡単です!
今すぐあなたのウェブアプリにベクトル検索の力を加えてください!ついでにZilliz Cloud無料トライアルをご覧いただき、クラウド対応で信頼性が高く、高性能なMilvusクラスタを数分で稼働させる方法をご覧ください。
著者について
この投稿はEric Goebelbeckerによって書かれました。エリックは、ニューヨークの金融市場で25年間、市場データと金融情報交換(FIX)プロトコル・ネットワークのインフラ開発に携わってきた。彼は、チームを効果的にするもの(あるいはそうでないもの!)について話すのが大好きだ。
読み続けて

Why Deepseek is Waking up AI Giants Like OpenAI And Why You Should Care
Discover how DeepSeek R1's open-source AI model with superior reasoning capabilities and lower costs is disrupting the AI landscape and challenging tech giants like OpenAI.

Beyond PGVector: When Your Vector Database Needs a Formula 1 Upgrade
This blog explores why Postgres, with its vector search add-on, pgvector, works well for smaller projects and simpler use cases but reaches its limits for large-scale vector search.

Building Secure RAG Workflows with Chunk-Level Data Partitioning
Rob Quiros shared how integrating permissions and authorization into partitions can secure data at the chunk level, addressing privacy concerns.
