速看!Milvus JavaScript 客户端入门级使用指南

Milvus 是一款云原生的开源向量数据库,专为向量相似性搜索和 AI 应用赋能。Milvus 支持水平扩展,可以处理海量数据,同时,Milvus 还提供多语言的 SDK (包括 JavaScript)。

使用 Milvus node.js SDK,可以轻松搭建灵活且强大的数据处理系统。Milvus 支持使用 Node.js 连接至服务器,完成各种数据库操作。我们还可以使用 Milvus Nods.js SDK 进行一些列操作,如:创建 Collection(集合)、插入数据、构建索引、查询和搜索数据等。

本文为入门级使用教程,将从如何设置环境、连接至 Milvus 数据库、创建 Collection、进行数据操作(如插入和查询数据)。其中,连接数据库是最为重要的基础性步骤,只有连接 Milvus 数据库后,才能自由探索 Milvus 提供的丰富资源。准备好,3、2、1,开始!

01.前提条件

开始前,请先在开发系统安装所需软件和依赖。由于本教程使用 Milvus Lite,所以请安装:

  • Python 3.8 及以上版本

  • Node.js 12 及以上版本

  • npm 12 及以上版本

  • yarn

02.安装并运行 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
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

接着,通过 PyPi 安装 Milvus 向量数据库。

(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 ...

03.安装 Milvus node.js SDK

首先,初始化 npm。

[egoebelbecker@ares examples]$ npm init
[egoebelbecker@ares examples]$ npm install @zilliz/milvus2-sdk-node

完成后就可以开始编写代码啦!

04.使用 Javascript 玩转 Milvus

安装完 Milvus 和 JavaScript 之后,就可以开始运用它们了。

##3 连接 Milvus

通过 MilvusClient 连接 Milvus。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。这些 Javascript API 不一定会按照在您的代码中的顺序执行,所以,请务必注意 API 执行时间点。您可以借助 promise 链式调用、代码块、await 等手段确保函数按照您指定的顺序执行。

为确保代码易读性,本教程将使用独立的代码块,并在执行完成后打印 promise。在必要时,代码中还会使用 await 作为一种强制指定执行顺序的手段。本教程代码不适用于生产环境,请务必注意。

以下代码通过 createDatabase 创建数据库,使用 await 保证在上一个命令执行完后再执行下一个命令。最后本代码还通过 listDatabases 验证新数据库是否创建成功。

CreateDatabase 只需要提供新数据库名称这 1 个参数值。

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'' }
}

创建集合(Collection)

数据库创建完成后,我们就可以继续在数据库中创建集合并插入数据。

以下代码在连接 Milvus 后,在 my_db 数据库中通过 createCollection创建新 Collection。创建后,通过 describeCollection检查是否创建成功。创建新 Collection 时需要设置 Schema,定义数据类型。因此,代码中需要导入 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 field',
        data_type: DataType.Int64,
        is_primary_keytrue,
        autoIDtrue,
      },
      {
        name'vector',
        description'Vector field',
        data_type: DataType.FloatVector,
        dim8,
      },
      { name'height'description'int64 field'data_type: DataType.Int64 },
      {
        name'name',
        description'VarChar field',
        data_type: DataType.VarChar,
        max_length128,
      },
    ],
  });
  console.log('Create collection is finished.', create);

  await milvusClient.describeCollection({ collection_name'sample_collection'});

  console.log('describe collection', describeCollection);
 })();

脚本运行成功后会返回新 Collection 信息。

Connection status: 1new 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'',
    autoIDfalse,
    enable_dynamic_fieldfalse
  },
  collectionID'443014985196255045',
  created_timestamp'443015720996700166',
  created_utc_timestamp'1689970859515',
  shards_num1,
  consistency_level'Bounded',
  collection_name'sample_collection',
  db_name'my_db',
  num_partitions'1'
}

插入数据、查询数据

插入前先准备数据。以下脚本使用 InsertReq 向新 Collection 中插入数据。

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.118783105811111730.96949479029347010.16443679307243175,
        0.54842261890972370.98392467090119240.5178387104937776,
        0.87169261292080690.5616972243831446,
      ],
      height20405,
      name'zlnmh',
    },
    {
      vector: [
        0.99920907312365360.82487906118094870.8660083940881405,
        0.099463593184812240.67906980639086690.5013786801063624,
        0.7953119157251050.9183033261617566,
      ],
      height93773,
      name'5lr9y',
    },
    {
      vector: [
        0.87612915698187630.071273660441532270.775648976160332,
        0.56197576013048780.60765431204769960.8373907516027586,
        0.85561401715976480.4043893119391049,
      ],
      height85122,
      name'nes0j',
    },
    {
      vector: [
        0.58496024360798790.51082581016825860.8250884731578105,
        0.79963548355093320.82077667749117360.38133662902290566,
        0.75767200555081860.4393152967662368,
      ],
      height92037,
      name'ct2li',
    },
    {
      vector: [
        0.37681337167388860.38232592610208660.7906232829855262,
        0.316936967262841930.37317154034991760.3300751870649885,
        0.223535561377962380.38062799545615444,
      ],
      height31400,
      name'6ghrg',
    },
    {
      vector: [
        0.00075317782124839640.129415661187749940.9340164428788116,
        0.37957688377586420.45324432580643890.596455163143,
        0.95294691587829060.7692465408044873,
      ],
      height1778,
      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: [ 012345 ],
  err_index: [],
  status: { error_code'Success'reason'' },
  IDs: { int_id: { data: [Array] }, id_field'int_id' },
  acknowledgedfalse,
  insert_cnt'6',
  delete_cnt'0',
  upsert_cnt'0',
  timestamp'443015922585698312'
}

数据插入完成后就可以开始查询数据了。在正式开始查询前,可以先为 Collection 构建索引,加速查询。以下代码针对向量字段构建索引。

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'],
    limit100,
  });
  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' }
  ]
}

向量搜索

将 Collection 加载到内存后,可以进行向量相似性搜索。

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'],
    limit5,
  });
  console.log('query result', query);
})();

以下为搜索结果:

  Search result {
  status: { error_code'Success'reason'' },
  results: [
    { score0id'442936641561652921'age'442936641561652921' },
    {
      score1.0004949569702148,
      id'442936641561652924',
      age'442936641561652924'
    },
    {
      score1.6779069900512695,
      id'442936641561652926',
      age'442936641561652926'
    },
    {
      score1.7160398960113525,
      id'442936641561652922',
      age'442936641561652922'
    },
    {
      score1.718210220336914,
      id'442936641561652925',
      age'442936641561652925'
    }
  ]
}

05.总结

本教程展示了如何部署环境,并使用 JavaScript 玩转 Milvus。文本具体展示了如何连接 Milvus 服务器、创建数据库和 Collection、插入数据、查询数据、进行向量相似性搜索。

如果大家想要更轻松地使用 Milvus,还可以试试 Zilliz Cloud——全托管的向量数据库服务,提供开箱即用的 Milvus 体验。

🌟「寻找 AIGC 时代的 CVP 实践之星」 专题活动即将启动!

Zilliz 将联合国内头部大模型厂商一同甄选应用场景, 由双方提供向量数据库与大模型顶级技术专家为用户赋能,一同打磨应用,提升落地效果,赋能业务本身。

如果你的应用也适合 CVP 框架,且正为应用落地和实际效果发愁,可直接申请参与活动,获得最专业的帮助和指导!联系邮箱为 business@zilliz.com。

本文作者

Eric Goebelbecker 现居纽约,有着 25 年的金融市场从业经验。他负责为金融资讯交换(FIX)协定网络和市场数据分析系统搭建基础设施。Eric 热衷于探索各种提升团队工作效率的工具和软件。


  • 如果在使用 Milvus 或 Zilliz 产品有任何问题,可添加小助手微信 “zilliz-tech” 加入交流群。

  • 欢迎关注微信公众号“Zilliz”,了解最新资讯。

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/32109.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php代码审计,php漏洞详解

文章目录 1、输入验证和输出显示2、命令注入(Command Injection)3、eval 注入(Eval Injection)4、跨网站脚本攻击(Cross Site Scripting, XSS)5、SQL 注入攻击(SQL injection)6、跨网站请求伪造攻击(Cross Site Request Forgeries, CSRF)7、Session 会话劫持(Session Hijacking…

vue 后端返回文件流,前端导出下载

vue 后端返回文件流&#xff0c;前端导出下载 配置axios响应拦截器 request.interceptors.response.use((response) > {const res response.data// 关键代码: 返回的是文件流if (res instanceof Blob) {return response}if (res.code 200 || res true) {return res} el…

Python使用OpenAI 和大型语言模型对话PDF和图像文本

本文首先介绍文件文本嵌入方法及代码实现&#xff0c;然后介绍和代码实现提取PDF和图像文本应用于大型语言模型。在此基础上&#xff0c;构建回答任何问题的人工智能助手。 创建文本嵌入 文本嵌入是自然语言处理&#xff08;NLP&#xff09;领域的重要工具。它们是文本的数字…

线性代数复习公式整理(自用/持续更新)

第一章 行列式 设A、B为n阶矩阵 ∣ A T ∣ ∣ A ∣ \left | A^T \right | \left | A \right | ​AT ​∣A∣ ∣ A m ∣ ∣ A ∣ m \left | A^m \right | \left | A \right | ^m ∣Am∣∣A∣m ∣ k A ∣ k n ∣ A ∣ \left | kA \right | k^n\left | A \right | ∣kA∣kn∣A…

自动化实践-全量Json对比在技改需求提效实践

1 背景 随着自动化测试左移实践深入&#xff0c;越来越多不同类型的需求开始用自动化测试左移来实践&#xff0c;在实践的过程中也有了新的提效诉求&#xff0c;比如技改类的服务拆分项目或者BC流量拆分的项目&#xff0c;在实践过程中&#xff0c;这类需求会期望不同染色环境…

【BASH】回顾与知识点梳理(十九)

【BASH】回顾与知识点梳理 十九 十九. 循环 (loop)19.1 while do done, until do done (不定循环)19.2 for...do...done (固定循环)19.3 for...do...done 的数值处理(C写法)19.4 搭配随机数与数组的实验19.5 shell script 的追踪与 debug19.6 what_to_eat-2.sh debug结果解析 该…

SpringCloud源码探析(九)- Sentinel概念及使用

1.概述 在微服务的依赖调用中&#xff0c;若被调用方出现故障&#xff0c;出于自我保护的目的&#xff0c;调用方会主动停止调用&#xff0c;并根据业务需要进行对应处理&#xff0c;这种方式叫做熔断&#xff0c;是微服务的一种保护方式。为了保证服务的高可用性&#xff0c;…

即然利用反射机制可以破坏单例模式,有什么方法避免呢?

私有构造方法中添加防止多次实例化的逻辑&#xff1a;在单例类的私有构造方法中&#xff0c;可以添加逻辑来检查是否已经存在实例&#xff0c;如果存在则抛出异常或返回已有的实例。这样即使通过反射创建了新的实例&#xff0c;也能在构造方法中进行拦截。 使用枚举实现单例&a…

rknn3588如何查看npu使用情况

cat /sys/kernel/debug/rknpu/load

choices参数的使用、MTV和MVC的概念、对多的三种创建方式、Ajax技术

一、choices参数的使用 choices它是ORM中常用字段中的参数choices的作用&#xff1a;类似于一些字段&#xff1a;性别、学历、客户来源、是否上学、是否结婚等字段# 针对于一些字段它的情况能够被列举完&#xff0c;像这样的字段&#xff0c;我们在表中存储的时候一般使用choi…

windows环境下编译OpenJDK12

环境&#xff1a;Windows11 目录&#xff1a; 1、下载OpenJDK12源码 下载地址&#xff1a; https://hg.openjdk.org/jdk/jdk12 点击zip下载到本地。 解压到本地。 Tip&#xff1a;注意本地路径中最好不要包含中文或空格。 2、阅读一遍doc/building.html 如果只是想构建J…

白帽黑帽与linux安全操作

目录 白帽黑帽 Linux安全 白帽黑帽 白帽&#xff08;White Hat&#xff09;和黑帽&#xff08;Black Hat&#xff09;通常用于描述计算机安全领域中的两种不同角色。白帽黑客通常被认为是合法的安全专家&#xff0c;他们通过合法途径寻找和修复安全漏洞&#xff0c;帮助企业和…

Linux/centos上如何配置管理samba服务器?

Linux/centos上如何配置管理samba服务器&#xff1f; 1 samba服务相关知识1.1 SMB协议1.2 samba工作原理1.2.1 相关进程1.2.2 samba工作流程1.2.3 samba功能 2 samba服务器安装2.1 利用光驱安装2.2 利用光盘映射文件 3 启动与停止samba服务4 配置samba服务器4.1 samba主配置文件…

解读百威亚太2023上半年财报:啤酒大年百威如何重塑高端化之路?

随着消费者的需求提升&#xff0c;啤酒行业向高端化发展&#xff0c;其中知名度较高的百威亚太、华润啤酒、青岛啤酒、燕京啤酒、嘉士伯等品牌在高端市场持续鏖战&#xff0c;实际成果如何也可以从业绩一探究竟。 以百威亚太为例。8月3日&#xff0c;百威亚太发布2023年上半年…

记录一次electron打包提示文件找不到的解决方法

没有配置files选项 files的作用是配置打包到应用程序的构建资源 就是说如果你想使用项目那个目录下的文件 就得通过files配置一下不然就会报错 json文件或者yml文件会报的错 格式是这样的 "files": ["dist-electron", "dist"],electron打包配…

React配置代理服务器的5种方法

五种方法的介绍 以下是五种在React项目中配置代理服务器的方法的使用场景和优缺点&#xff1a; 1. 使用 http-proxy-middleware 中间件&#xff1a; 使用场景&#xff1a;适用于大多数React项目&#xff0c;简单易用。优点&#xff1a;配置简单&#xff0c;易于理解和维护。…

【C++学习】STL容器——list

目录 一、list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modifiers 1.2.6 list 迭代器失效 二、list的模拟实现 2.1 模拟实现list 三、list和vector的对比…

HTTPS、TLS加密传输

HTTPS、TLS加密传输 HTTPS、TLS加密传输1、HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09;2、TLS HTTPS、TLS加密传输 1、HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09; HTTPS&#xff08;HyperText Transfer Protocol Secure&#x…

Ozone命令行接口详解

命令行接口简介 Ozone Shell是命令行与Ozone交互的主要界面&#xff0c;底层用的是Java。 有些功能只能通过Ozone Shell进行操作&#xff1a; 创建带有限额限制的Volume管理内部ACLs&#xff08;访问控制列表&#xff09;创建带有加密密钥的存储桶 大部分操作除了Shell操作…

【算法挨揍日记】day01——双指针算法_移动零、 复写零

283.移动零 283. 移动零https://leetcode.cn/problems/move-zeroes/ 题目&#xff1a; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 …