使用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删除集合中的指定点。
- 更新点的向量:更新某个点的向量值,适用于数据的修改。
每个案例展示了不同的操作,你可以根据具体需求进行调整。
热门推荐
信鸽训练秘籍:从品种选择到科学训练
村松白信鸽:传奇背后的秘密
昆明必游景点:国立西南联大旧址
石林和滇池:昆明必打卡的两大宝藏景点
昆明旅游旺季,这些地方千万别错过!
澧溪中学特色活动:《长安三万里》与新疆国学行
哈佛科学家验证AI无袖带血压计可优化高血压患者管理
智能雨刮系统:从奔驰GLA200看汽车技术的未来
孙怡海南电影节红毯造型惊艳全场,白色抹胸裙尽显优雅气质
RTK高精度定位技术:实现厘米级测量的载波相位差分技术
冬至到,喝鸽子汤!这碗传统养生汤,如何增强免疫力?
坐月子喝鸽子汤,科学还是迷信?
产后康复神器:鸽子汤的秘密
产后妈妈必喝的鸽子汤,真的这么神?
新手妈妈必知:鸽子汤的滋补秘密
肤感白配南美橡木:打造轻奢家居的绝妙组合
张宇轩:从舞蹈演员到《玉骨遥》中的“海皇”苏摩
红艳煞来袭,你的感情运势如何?
个人养老金保险产品选购指南:144只产品如何选?
2024年退休老人存款风险管理指南
科目一必考:应急标志与疏散标志的区别与应用
商场应急标志布置规范:这些细节关乎生命安全
秋冬季节,哪种材质的卫生巾更适合你?
健身女神桃桃子:有氧、力量、平衡三维度塑造理想身材
学历报告编号查询指南:四种实用途径详解
河南北斗系统升级:国产化替代完成,定位精度大幅提升
去家务化设计,打造超级易洁家居
建筑平面图揭秘:完美房间布置指南
笔记本键盘锁定?三步轻松搞定!
笔记本键盘锁住了?6种实用解锁方法帮你轻松应对