Milvus向量检索Demo初探

Milvus 是什么

Milvus 于 2019 年开源,致力于存储、索引和管理由深度神经网络学习与其他机器学习模型生成的海量 Embedding 向量。

Milvus 向量数据库专为向量查询与检索设计,能够为万亿级向量数据建立索引。与现有的主要用作处理结构化数据的关系型数据库不同,Milvus 在底层设计上就是为了处理由各种非结构化数据转换而来的 Embedding 向量而生。

Milvus 2.0 是一款云原生向量数据库,采用存储与计算分离的架构设计,所有组件均为无状态组件,极大地增强了系统弹性和灵活性。

Demo

from pymilvus import connections
# 1 创建连接
connections.connect(
	alias="default", 
	host='localhost', 
	port='19530'
	)
# 2 创建 collection,相当于一个表,类似 mongo 中 collection 概念
from pymilvus import CollectionSchema, FieldSchema, DataType
book_id = FieldSchema(
    name="book_id", 
    dtype=DataType.INT64, 
    is_primary=True, 
    )
word_count = FieldSchema(
    name="word_count", 
    dtype=DataType.INT64,  
    )
book_intro = FieldSchema(
    name="book_intro", 
    dtype=DataType.FLOAT_VECTOR, 
    dim=2
    )
schema = CollectionSchema(
    fields=[book_id, word_count, book_intro], 
    description="Test book search"
    )
collection_name = "book" #类似于表名
from pymilvus import Collection
collection = Collection(
    name=collection_name, 
    schema=schema, 
    using='default', # milvus server name
    shards_num=2,
    consistency_level="Strong"
    )


# 3 为 collections 创建分区,默认为 collection创建两个分区
collection = Collection("book")      # Get an existing collection.
collection.create_partition("novel")

# 4 插入数据到 collection
import random
# data[0] book_id, data[1] word_count, data[2]向量,总共 2000个 item 
data = [[i for i in range(2000)],
		[i for i in range(10000, 12000)],
    	[[random.random() for _ in range(2)] for _ in range(2000)],
		]
mr = collection.insert(data)

# 5 创建索引
# 索引参数
index_params = {
        "metric_type":"L2",
        "index_type":"IVF_FLAT", #加聚类的倒排索引
        "params":{"nlist":1024} # 聚成 1024 个类
    }
# 向 collections 中插入索引
collection.create_index(
    field_name="book_intro", # collection中的存储向量的字段
    index_params=index_params
    )
# 6 向量搜索,进行搜索之前要先将 collection加载到内存
collection = Collection("book")      # Get an existing collection.
collection.load()
import time

# 准备搜索参数
search_params = {"metric_type": "L2", "params": {"nprobe": 100}} # 搜索最相似的 100 个item
start = time.time()
results = collection.search(
	data=[[0.1, 0.2]], # query 向量,这个列子中向量维度是2
	anns_field="book_intro", 
	param=search_params, 
	limit=10, # 返回 topK
	expr=None,
	consistency_level="Strong"
)
end = time.time()
# 搜索结果
print(results[0].ids, results[0].distances, end - start)
'''
([1073, 448, 489, 23, 752, 1496, 10, 1965, 1534, 107],
 [3.3897744287969545e-05, 0.000469639606308192, 0.0006169890984892845, 0.0006427020998671651, 0.000682430574670434, 0.000686873565427959, 0.0007882573409006, 0.0013403998455032706, 0.0016471443232148886, 0.0016562778037041426],
 0.2413792610168457)
'''


# 7 混合向量检索,在向量检索基础上,支持标量的指定范围查询
search_param = {
    "data": [[0.1, 0.2]],
    "anns_field": "book_intro",
    "param": {"metric_type": "L2", "params": {"nprobe": 10}},
    "limit": 2,
    "expr": "word_count <= 11000", # 指定查询表达式
}
res = collection.search(**search_param)
print(res[0])
'''
['(distance: 0.000469639606308192, id: 448)', '(distance: 0.0006169890984892845, id: 489)']
'''
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个Milvus的Java示例代码: ```java import io.milvus.client.*; import java.util.Arrays; import java.util.List; public class MilvusDemo { public static void main(String[] args) { // 设置Milvus服务器的IP地址和端口号 String host = "127.0.0.1"; int port = 19530; // 创建Milvus客户端 MilvusClient client = new MilvusGrpcClient(); // 连接到Milvus服务器 ConnectParam connectParam = new ConnectParam.Builder() .withHost(host) .withPort(port) .build(); Response connectResponse = client.connect(connectParam); if (!connectResponse.ok()) { System.out.println("连接到Milvus服务器失败:" + connectResponse.getMessage()); return; } // 创建一个Milvus集合 String collectionName = "my_collection"; FieldSchema vectorField = new FieldSchema.Builder("vector", DataType.FLOAT_VECTOR, 128).build(); CollectionMapping collectionMapping = new CollectionMapping.Builder(collectionName, Arrays.asList(vectorField)).build(); Response createCollectionResponse = client.createCollection(collectionMapping); if (!createCollectionResponse.ok()) { System.out.println("创建Milvus集合失败:" + createCollectionResponse.getMessage()); return; } // 插入向量数据 List<FloatVector> vectors = Arrays.asList( new FloatVector(Arrays.asList(0.1f, 0.2f, 0.3f)), new FloatVector(Arrays.asList(0.4f, 0.5f, 0.6f)), new FloatVector(Arrays.asList(0.7f, 0.8f, 0.9f)) ); InsertParam insertParam = new InsertParam.Builder(collectionName, vectors).build(); Response insertResponse = client.insert(insertParam); if (!insertResponse.ok()) { System.out.println("插入向量数据失败:" + insertResponse.getMessage()); return; } // 查询相似的向量 List<FloatVector> queryVectors = Arrays.asList( new FloatVector(Arrays.asList(0.2f, 0.3f, 0.4f)) ); SearchParam searchParam = new SearchParam.Builder(collectionName, queryVectors, 1).build(); Response searchResponse = client.search(searchParam); if (!searchResponse.ok()) { System.out.println("查询相似的向量失败:" + searchResponse.getMessage()); return; } // 打印查询结果 SearchResult searchResult = searchResponse.getSearchResult(); List<List<SearchResult.VectorData>> vectorDataList = searchResult.getVectorDataList(); for (List<SearchResult.VectorData> vectorData : vectorDataList) { for (SearchResult.VectorData data : vectorData) { System.out.println("相似的向量:" + data.getVector()); System.out.println("相似度:" + data.getDistance()); } } // 断开与Milvus服务器的连接 Response disconnectResponse = client.disconnect(); if (!disconnectResponse.ok()) { System.out.println("断开与Milvus服务器的连接失败:" + disconnectResponse.getMessage()); return; } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值