惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

aimingoo的专栏
aimingoo的专栏
宝玉的分享
宝玉的分享
博客园 - 【当耐特】
博客园 - 司徒正美
L
LangChain Blog
有赞技术团队
有赞技术团队
大猫的无限游戏
大猫的无限游戏
Stack Overflow Blog
Stack Overflow Blog
Engineering at Meta
Engineering at Meta
U
Unit 42
Microsoft Azure Blog
Microsoft Azure Blog
I
InfoQ
博客园 - 叶小钗
H
Hackread – Cybersecurity News, Data Breaches, AI and More
J
Java Code Geeks
月光博客
月光博客
量子位
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园_首页
Last Week in AI
Last Week in AI
人人都是产品经理
人人都是产品经理
Google DeepMind News
Google DeepMind News
云风的 BLOG
云风的 BLOG
D
DataBreaches.Net

博客园 - work hard work smart

Java 面试1 Java 常见面试问题 手撕java常用代码 WebStorm 创建react工程 构建企业级 Text-to-SQL Agent:基于 LangGraph 的智能数据查询系统设计 Harness 工程:驾驭 AI Agent 的工程化艺术 DeepAgents 多智能体架构实战:从设计模式到后端选型 Vue 自定义组件完全指南:从零构建待办事项应用 使用 LangChain + Hugging Face 构建文本向量化服务 SQLAlchemy 使用详解 Python 中使用 Elasticsearch 的完整指南 OpenEvals 快速入门:LLM 评估指南 DeepEval 快速入门:LLM 应用评估指南 LangSmith 批量评估完全指南 Qwen-Agent 入门指南:快速构建智能体应用 LangSmith 集成实战:从追踪到评估的完整指南 初识 go-zero:一款让你写后端更规范、更高效的 Go 微服务框架 RAG 中为什么需要 Rerank,以及如何使用 Rerank LangChain4j RAG 核心组件与组合方式 如何使用 Elasticsearch 进行全文检索和向量检索 MinerU Docker 部署指南 5 分钟上手:为 Cline 配置一个免费的 MCP 天气服务 Neo4j 图数据库安装与 Spring Boot 集成实战指南 LangFuse 实战指南:用 @observe 三行代码给 LLM 应用加上全链路追踪 Function Call 深度解析:让大模型从"嘴炮"到"实干"的技术革命 Spring AI 提示词模板实战:告别硬编码,实现提示词工程化管理 LangChain4j 实战指南:用 Java 轻松构建 AI 应用 Spring AI 对话短期记忆实战:让大模型拥有"记忆力" Spring AI 提示词工程实战:让大模型更懂你的意图 Spring AI ChatClient 深度解析:优雅构建大模型应用的利器
Qdrant 向量数据库使用指南
work hard work smart · 2026-07-05 · via 博客园 - work hard work smart

Qdrant 向量数据库使用指南

1. Qdrant 简介

Qdrant 是一个高性能、开源的向量数据库,专门为处理和搜索大规模向量数据而设计。它提供了实时的向量相似度搜索功能,支持多种距离度量(如余弦相似度、欧几里得距离等),并具有强大的过滤和查询能力。Qdrant 特别适合用于构建语义搜索、推荐系统、图像识别和自然语言处理等应用。

2. 安装和启动 Qdrant

2.1 使用 Docker 安装(推荐)

# 拉取 Qdrant 镜像
docker pull qdrant/qdrant

# 启动 Qdrant 容器
docker run -p 6333:6333 -p 6334:6334 qdrant/qdrant

2.2 从源代码安装

# 克隆 Qdrant 仓库
git clone https://github.com/qdrant/qdrant.git

# 构建并运行 Qdrant
cd qdrant
cargo run --release

2.3 验证 Qdrant 是否正常运行

# 访问 Qdrant 健康检查端点
curl -X GET http://localhost:6333/healthz

如果返回 {"status":"ok"},说明 Qdrant 已成功启动。

2.4 访问 Qdrant Web UI

Qdrant 提供了一个内置的 Web 界面,用于可视化和管理数据。

访问地址:
打开浏览器访问 http://localhost:6333/dashboard

Web UI 功能:

  • 查看所有集合的基本信息和统计数据
  • 查询向量数据和可视化查询结果
  • 管理集合配置和索引
  • 数据导入/导出功能
  • 查询性能分析和优化建议

3. 基础配置

3.1 配置文件

Qdrant 使用 YAML 文件进行配置,默认路径为 /qdrant/config/production.yaml。常见配置项包括:

service:
  grpc_port: 6334
  http_port: 6333
  host: 0.0.0.0

storage:
  storage_path: ./storage
  snapshot_dir: ./snapshots

3.2 环境变量配置

# 设置 Qdrant 数据存储路径
export QDRANT_STORAGE_PATH=/path/to/storage

# 设置 Qdrant 监听地址
export QDRANT_HOST=0.0.0.0

# 启动 Qdrant
qdrant

4. 使用 Python 客户端

4.1 安装 Python 客户端

pip install qdrant-client

4.2 基本操作

from qdrant_client import QdrantClient
from qdrant_client.models import VectorParams, Distance, PointStruct

# 连接到 Qdrant
client = QdrantClient(host="localhost", port=6333)

# 创建集合
collection_name = "test_collection"
client.recreate_collection(
    collection_name=collection_name,
    vectors_config=VectorParams(size=4, distance=Distance.COSINE)
)

# 插入数据
points = [
    PointStruct(id=1, vector=[0.05, 0.61, 0.76, 0.74], payload={"city": "Berlin"}),
    PointStruct(id=2, vector=[0.19, 0.81, 0.75, 0.11], payload={"city": "London"}),
    PointStruct(id=3, vector=[0.36, 0.55, 0.47, 0.94], payload={"city": "Moscow"}),
    PointStruct(id=4, vector=[0.18, 0.01, 0.85, 0.80], payload={"city": "New York"}),
    PointStruct(id=5, vector=[0.24, 0.18, 0.22, 0.44], payload={"city": "Beijing"}),
    PointStruct(id=6, vector=[0.35, 0.08, 0.11, 0.44], payload={"city": "Mumbai"}),
]
client.upsert(collection_name=collection_name, points=points)

# 搜索数据
search_result = client.search(
    collection_name=collection_name,
    query=[0.2, 0.1, 0.9, 0.7],
    limit=3
)

print("搜索结果:")
for point in search_result:
    print(f"ID: {point.id}, 分数: {point.score}, 城市: {point.payload['city']}")

# 删除集合
client.delete_collection(collection_name=collection_name)

5. 使用异步 Python 客户端

5.1 异步操作示例

import asyncio
from qdrant_client import AsyncQdrantClient
from qdrant_client.models import VectorParams, Distance, PointStruct

async def main():
    client = AsyncQdrantClient(host="localhost", port=6333)
    
    # 创建集合
    collection_name = "async_collection"
    await client.recreate_collection(
        collection_name=collection_name,
        vectors_config=VectorParams(size=4, distance=Distance.COSINE)
    )
    
    # 插入数据
    points = [
        PointStruct(id=1, vector=[0.05, 0.61, 0.76, 0.74], payload={"city": "Berlin"}),
        PointStruct(id=2, vector=[0.19, 0.81, 0.75, 0.11], payload={"city": "London"}),
        PointStruct(id=3, vector=[0.36, 0.55, 0.47, 0.94], payload={"city": "Moscow"}),
    ]
    await client.upsert(collection_name=collection_name, points=points)
    
    # 搜索数据
    search_result = await client.search(
        collection_name=collection_name,
        query=[0.2, 0.1, 0.9, 0.7],
        limit=2
    )
    
    print("异步搜索结果:")
    for point in search_result:
        print(f"ID: {point.id}, 分数: {point.score}, 城市: {point.payload['city']}")
    
    # 删除集合
    await client.delete_collection(collection_name=collection_name)

asyncio.run(main())

6. 高级功能

6.1 过滤搜索

search_result = client.search(
    collection_name=collection_name,
    query=[0.2, 0.1, 0.9, 0.7],
    limit=3,
    query_filter={
        "must": [
            {
                "key": "city",
                "match": {
                    "text": {
                        "query": "London",
                        "boost": 2.0
                    }
                }
            }
        ]
    }
)

6.2 分页搜索

search_result = client.scroll(
    collection_name=collection_name,
    offset=0,
    limit=10,
    scroll_filter={
        "must": [
            {
                "key": "city",
                "match": {
                    "keyword": "Berlin"
                }
            }
        ]
    }
)

6.3 更新和删除数据

# 更新数据
updated_point = PointStruct(id=1, vector=[0.1, 0.2, 0.3, 0.4], payload={"city": "New Berlin"})
client.upsert(collection_name=collection_name, points=[updated_point])

# 删除数据
client.delete(collection_name=collection_name, points_selector={"ids": [1]})

6.4 集合操作

# 获取集合信息
collection_info = client.get_collection(collection_name=collection_name)
print(f"集合名称: {collection_info.name}")
print(f"向量维度: {collection_info.config.params.vectors.size}")
print(f"距离度量: {collection_info.config.params.vectors.distance}")

# 获取集合统计信息
collection_stats = client.get_collection_stats(collection_name=collection_name)
print(f"点数量: {collection_stats.points_count}")
print(f"向量数量: {collection_stats.vectors_count}")

# 优化集合
client.optimize_collection(collection_name=collection_name)

7. 性能优化

7.1 配置优化

# 调整搜索参数
search:
  default_limit: 10
  score_threshold: 0.5
  radius: 0.5

# 调整存储参数
storage:
  optimize_on_disk_threshold: 0.5
  preload_collection_names: ["collection1", "collection2"]

7.2 查询优化

search_result = client.search(
    collection_name=collection_name,
    query=[0.2, 0.1, 0.9, 0.7],
    limit=10,
    score_threshold=0.5,
    radius=0.8,
    with_payload=False,  # 不返回 payload 以提高速度
    with_vectors=False   # 不返回向量以提高速度
)

7.3 批量操作

# 批量插入
large_points = [
    PointStruct(id=i, vector=[0.1 * i, 0.2 * i, 0.3 * i, 0.4 * i], payload={"value": i})
    for i in range(1000)
]
client.upsert(collection_name=collection_name, points=large_points)

# 批量删除
client.delete(collection_name=collection_name, points_selector={"ids": list(range(500))})

8. 与其他工具集成

8.1 与 Hugging Face 集成

from transformers import AutoTokenizer, AutoModel
import torch

# 加载模型
tokenizer = AutoTokenizer.from_pretrained("sentence-transformers/all-MiniLM-L6-v2")
model = AutoModel.from_pretrained("sentence-transformers/all-MiniLM-L6-v2")

# 编码文本
text = "Hello, world!"
inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True)
with torch.no_grad():
    outputs = model(**inputs)
vector = outputs.last_hidden_state.mean(dim=1).squeeze().tolist()

# 存储到 Qdrant
point = PointStruct(id=1, vector=vector, payload={"text": text})
client.upsert(collection_name=collection_name, points=[point])

8.2 与 Flask 集成

from flask import Flask, request, jsonify
from qdrant_client import QdrantClient
from qdrant_client.models import PointStruct

app = Flask(__name__)
client = QdrantClient(host="localhost", port=6333)

@app.route("/search", methods=["POST"])
def search():
    data = request.get_json()
    query_vector = data["query_vector"]
    
    search_result = client.search(
        collection_name="text_embeddings",
        query=query_vector,
        limit=10
    )
    
    results = []
    for point in search_result:
        results.append({
            "id": point.id,
            "score": point.score,
            "text": point.payload["text"]
        })
    
    return jsonify(results)

if __name__ == "__main__":
    app.run()

9. 故障排除

9.1 常见错误和解决方案

错误:连接超时

原因:Qdrant 服务未启动或网络连接问题
解决方案

  1. 检查 Qdrant 服务是否正在运行
  2. 检查防火墙设置
  3. 确认主机名和端口是否正确

错误:集合不存在

原因:集合已被删除或尚未创建
解决方案

  1. 检查集合名称是否正确
  2. 确认集合是否已创建
  3. 使用 create_collectionrecreate_collection 方法创建集合

错误:向量维度不匹配

原因:插入的向量维度与集合配置不匹配
解决方案

  1. 检查插入向量的维度
  2. 确认集合配置的向量维度
  3. 重新创建集合或调整向量维度

9.2 日志和监控

# 启用调试日志
client = QdrantClient(
    host="localhost",
    port=6333,
    grpc_port=6334,
    timeout=10.0,
    log_level="DEBUG"
)

# 获取日志信息
import logging
logging.basicConfig(level=logging.DEBUG)

10. 总结

Qdrant 是一个功能强大且易于使用的向量数据库,具有良好的性能和可扩展性。它支持多种编程语言和集成方式,适合各种向量数据存储和搜索场景。

通过合理的配置和优化,Qdrant 可以处理大规模向量数据,并提供快速、准确的搜索结果。如果您正在构建与向量相似度搜索相关的应用,Qdrant 是一个值得考虑的选择。