使用Docker安装和操作Qdrant向量数据库
创作时间:
作者:
@小白创作中心
使用Docker安装和操作Qdrant向量数据库
引用
CSDN
1.
https://m.blog.csdn.net/weimeilayer/article/details/144353837
Qdrant是一个开源的向量数据库,支持大规模的向量存储和相似度搜索。本文将介绍如何使用Docker快速安装Qdrant,并通过Java客户端进行基本操作。
使用Docker安装Qdrant向量数据库
要在Docker中运行Qdrant,可以使用以下命令:
docker run -p 6333:6333 -p 6334:6334 qdrant/qdrant
要在Docker中运行Qdrant并将数据存储到宿主机,可以使用以下命令:
docker run -p 6333:6333 -p 6334:6334 \
-v /data/qdrant/storage:/qdrant/storage \
qdrant/qdrant
参数说明:
-p 6333:6333和-p 6334:6334:将容器的6333和6334端口映射到宿主机。-v /data/qdrant/data:/qdrant/storage:/data/qdrant/data是宿主机上的目录,用于存储Qdrant的数据。/qdrant/storage是容器内部的存储路径。
注意事项:
请确保/data/qdrant/data目录在宿主机上存在,并具有Docker容器可以写入的权限。如果目录不存在,可以通过以下命令创建:
mkdir -p /data/qdrant/data
chmod 777 /data/qdrant/data
如果Qdrant更新或容器被销毁,数据会保存在宿主机上,不会丢失。
完成后,您可以通过访问http://<宿主机IP>:6333来访问Qdrant服务。
Qdrant架构
上图展示了Qdrant一些主要组件的高级概述。以下是您应该熟悉的术语:
- 集合(Collections):集合是一组命名的点(带有有效负载的向量),您可以在其中进行搜索。同一集合中每个点的向量必须具有相同的维度,并通过单个度量进行比较。命名向量可用于在单个点中包含多个向量,每个向量都可以有自己的维度和度量要求。
- 距离度量(Distance Metrics):这些用于测量向量之间的相似性,必须在创建集合的同时选择它们。度量的选择取决于向量的获取方式,特别是取决于将用于编码新查询的神经网络。
- 点(Points):点是Qdrant运行的中心实体,它们由向量和可选的id和有效负载组成。
- id:向量的唯一标识符。
- 矢量(Vector):数据的高维表示,例如图像、声音、文档、视频等。
- 有效负载(Payload):有效负载是一个JSON对象,其中包含可以添加到向量中的附加数据。
- 存储(Storage):Qdrant可以使用两种存储选项之一:内存存储(将所有向量存储在RAM中,具有最高速度,因为仅需要持久性才需要磁盘访问)或Memmap存储(创建与磁盘上的文件)。
- 客户端:可用于连接到Qdrant的编程语言。
Java客户端操作Qdrant
添加Maven依赖
<dependency>
<groupId>io.qdrant</groupId>
<artifactId>client</artifactId>
<version>3.7.0</version>
</dependency>
创建集合并插入向量
import io.qdrant.client.QdrantClient;
import io.qdrant.client.grpc.QdrantGrpcClient;
import io.qdrant.client.grpc.collections.Collections;
import io.qdrant.client.grpc.models.VectorParams;
import io.qdrant.client.grpc.models.Vector;
import io.qdrant.client.grpc.models.Point;
import java.util.List;
import java.util.concurrent.ExecutionException;
public class QdrantExample {
public static void main(String[] args) throws ExecutionException, InterruptedException {
// 创建Qdrant客户端,指定服务器地址和端口
QdrantClient client = new QdrantClient(
QdrantGrpcClient.newBuilder("172.16.17.111", 6334, false).build());
// 创建一个名为 "dev_collection" 的集合,指定向量的大小和距离度量方式
client.createCollectionAsync("dev_collection",
Collections.VectorParams.newBuilder()
.setDistance(Collections.Distance.Cosine) // 设置距离度量为Cosine相似度
.setSize(4) // 设置向量的大小为4
.build()).get(); // 等待创建完成
// 定义要插入的向量(每个向量包含4个浮动值)
List<Vector> vectors = List.of(
Vector.newBuilder().addValues(0.1f, 0.2f, 0.3f, 0.4f).build(), // 向量1
Vector.newBuilder().addValues(0.5f, 0.6f, 0.7f, 0.8f).build() // 向量2
);
// 创建要插入的点(每个点包含唯一的ID和相应的向量)
List<Point> points = List.of(
Point.newBuilder().setId(1).setVector(vectors.get(0)).build(), // 点1
Point.newBuilder().setId(2).setVector(vectors.get(1)).build() // 点2
);
// 将定义的点(向量)插入到 "dev_collection" 集合中
client.upsertAsync("dev_collection", points).get(); // 异步插入并等待完成
// 输出成功信息
System.out.println("集合 'dev_collection' 创建成功,并已插入向量。");
}
}
查询集合中的向量(基于ID查询)
import io.qdrant.client.QdrantClient;
import io.qdrant.client.grpc.QdrantGrpcClient;
import io.qdrant.client.grpc.models.Point;
import java.util.concurrent.ExecutionException;
public class QdrantQueryById {
public static void main(String[] args) throws ExecutionException, InterruptedException {
// 创建Qdrant客户端
QdrantClient client = new QdrantClient(
QdrantGrpcClient.newBuilder("172.16.17.111", 6334, false).build());
// 查询集合 "my_collection" 中ID为1的点
Point point = client.retrievePointAsync("my_collection", 1).get();
// 输出查询结果
System.out.println("查询到的点:ID = " + point.getId() + ", 向量 = " + point.getVector().getValuesList());
}
}
根据向量进行最近邻搜索
import io.qdrant.client.QdrantClient;
import io.qdrant.client.grpc.QdrantGrpcClient;
import io.qdrant.client.grpc.models.Vector;
import io.qdrant.client.grpc.models.SearchResult;
import io.qdrant.client.grpc.models.VectorParams;
import io.qdrant.client.grpc.models.SearchRequest;
import java.util.List;
import java.util.concurrent.ExecutionException;
public class QdrantSearchNearestNeighbors {
public static void main(String[] args) throws ExecutionException, InterruptedException {
// 创建Qdrant客户端
QdrantClient client = new QdrantClient(
QdrantGrpcClient.newBuilder("172.16.17.111", 6334, false).build());
// 定义查询向量
Vector queryVector = Vector.newBuilder().addValues(0.2f, 0.3f, 0.4f, 0.5f).build();
// 构建搜索请求,进行最近邻搜索
SearchRequest searchRequest = SearchRequest.newBuilder()
.setCollectionName("my_collection")
.setQueryVector(queryVector)
.setTop(3) // 返回最相似的前3个向量
.setParams(VectorParams.newBuilder().setDistance(VectorParams.Distance.Cosine).build())
.build();
// 执行搜索
List<SearchResult> searchResults = client.searchAsync(searchRequest).get();
// 输出搜索结果
System.out.println("最近邻搜索结果:");
for (SearchResult result : searchResults) {
System.out.println("ID = " + result.getId() + ", 距离 = " + result.getScore());
}
}
}
删除集合中的点
import io.qdrant.client.QdrantClient;
import io.qdrant.client.grpc.QdrantGrpcClient;
import java.util.concurrent.ExecutionException;
public class QdrantDeletePoint {
public static void main(String[] args) throws ExecutionException, InterruptedException {
// 创建Qdrant客户端
QdrantClient client = new QdrantClient(
QdrantGrpcClient.newBuilder("172.16.17.111", 6334, false).build());
// 删除集合 "my_collection" 中ID为2的点
client.deletePointAsync("my_collection", 2).get();
System.out.println("点ID为2的数据已从集合中删除。");
}
}
更新集合中的向量
import io.qdrant.client.QdrantClient;
import io.qdrant.client.grpc.QdrantGrpcClient;
import io.qdrant.client.grpc.models.Vector;
import io.qdrant.client.grpc.models.Point;
import java.util.concurrent.ExecutionException;
public class QdrantUpdateVector {
public static void main(String[] args) throws ExecutionException, InterruptedException {
// 创建Qdrant客户端
QdrantClient client = new QdrantClient(
QdrantGrpcClient.newBuilder("172.16.17.111", 6334, false).build());
// 定义更新后的向量
Vector updatedVector = Vector.newBuilder().addValues(0.8f, 0.7f, 0.6f, 0.5f).build();
// 创建点并更新向量
Point updatedPoint = Point.newBuilder().setId(1).setVector(updatedVector).build();
// 更新点的向量数据
client.upsertAsync("my_collection", List.of(updatedPoint)).get();
System.out.println("点ID为1的向量已更新。");
}
}
主要操作
- 插入多个向量:在集合中插入多个向量,通常用于批量插入数据。
- 基于ID查询点:通过点的ID来查询对应的向量数据。
- 最近邻搜索:根据一个查询向量进行最近邻搜索,返回最相似的向量。
- 删除点:通过ID删除集合中的指定点。
- 更新点的向量:更新某个点的向量值,适用于数据的修改。
每个案例展示了不同的操作,你可以根据具体需求进行调整。
热门推荐
C语言结构体类型详解:定义、创建与成员引用
手机界面变黑白屏?这份故障解决指南请收好
“三支一扶”是否必须是应届毕业生?事业单位招聘岗位信息获取指南
众民营企业家齐聚北京!任正非马云坐前排,美团老总王兴坐后排
会计分录编制步骤详解
“港风”热度不减 年内南向资金流入超2600亿元!哪些板块值得关注?
别再叫那些俗气的名字了!这些新颖独特的女孩名才是流行前沿!
金霉素的药理与药物配伍
每天早上吃水煮蛋有什么好处和坏处
股票投资要具备哪些基础知识
正常人两个肾脏一样大麼
推荐春天看的8部电影!提升审美,感受春光
《醉翁亭记》的写作背景与手法
劳动仲裁不受理起诉状以什么理由写起诉书
气胸高流量吸氧的作用是什么
大脑前额叶功能训练:五种科学提升方法
吊瓜的种植方法及管理办法
拔智齿白色假膜图片真实呈现,拔牙后创面愈合时新生肉芽组织表面出现的白色假膜
如何才能养殖好肉牛,需掌握先进的肉牛养殖技术及饲喂管理
企业名称登记的完整流程指南
奇门遁甲中值符和值使内容详解
房屋地基加固的七种常见方法
北京大兴国际机场接机、送机指南
水务工程专业就业方向与前景展望
户口·办事直通车:籍贯与户口所在地的区别及填写指南
深度解析:中国给水排水系统的发展与创新
住宅的种类及户型分类
北京市金融业发展现状及问题剖析
力量举比赛备赛期的5个实用性建议(建议收藏)
千湖之省,出生人口五年减半,省会城市人口连年增长