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

推荐订阅源

Google DeepMind News
Google DeepMind News
人人都是产品经理
人人都是产品经理
S
Securelist
P
Proofpoint News Feed
H
Help Net Security
S
Schneier on Security
T
Tenable Blog
C
Cisco Blogs
S
Security @ Cisco Blogs
博客园 - 司徒正美
博客园 - 叶小钗
Cisco Talos Blog
Cisco Talos Blog
Google DeepMind News
Google DeepMind News
C
Cybersecurity and Infrastructure Security Agency CISA
Google Online Security Blog
Google Online Security Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Hacker News: Ask HN
Hacker News: Ask HN
NISL@THU
NISL@THU
云风的 BLOG
云风的 BLOG
V
Vulnerabilities – Threatpost
T
The Blog of Author Tim Ferriss
aimingoo的专栏
aimingoo的专栏
W
WeLiveSecurity
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Jina AI
Jina AI
腾讯CDC
WordPress大学
WordPress大学
Simon Willison's Weblog
Simon Willison's Weblog
Vercel News
Vercel News
小众软件
小众软件
N
Netflix TechBlog - Medium
有赞技术团队
有赞技术团队
AWS News Blog
AWS News Blog
雷峰网
雷峰网
Forbes - Security
Forbes - Security
The Hacker News
The Hacker News
博客园 - 聂微东
F
Full Disclosure
量子位
Scott Helme
Scott Helme
宝玉的分享
宝玉的分享
A
About on SuperTechFans
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Schneier on Security
Schneier on Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
K
Kaspersky official blog
AI
AI
SecWiki News
SecWiki News
Webroot Blog
Webroot Blog
Martin Fowler
Martin Fowler

博客园 - work hard work smart

使用 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 深度解析:优雅构建大模型应用的利器 Spring AI Alibaba DashScopeChatModel 实战 Spring 中 SSE 流式输出的多种实现方式详解 OpenSandbox 实战指南:为 AI Agent 构建安全的代码执行沙箱 在本机启动 LangGraph 开发服务器:完整指南 DeepAgents中Backend的奥秘:让AI Agent拥有文件操作能力 为什么选择 Go 开发 Web 接口?从入门到实践 智能搜索DeepAgent笔记 RAG学习笔记2--系统查询流程 RAG学习笔记1--系统文件导入流程 百炼 WebSearch 快速入门指南 Python 连接 MongoDB 完整指南:从连接配置到增删改查实战 一行命令搞定 MongoDB 开发环境:Docker Compose 部署 + 可视化管理 使用 Attu 可视化管理 Milvus 向量数据库 在 Windows Docker 中快速安装 Milvus 2.5.6 minio使用 Spark 集群搭建 hadoop集群安装 Spring AI Alibaba 入门实战 Windows 安装 OpenClaw 实战指南 MyBatis 核心流程和原理 Idea中安装Claude code插件 Spark 编程 使用Matplotlib 绘制直方图 Flink安装部署 Flume安装 查找导致cpu过高的代码方法 JVisualVM监控远程Java进程 jmap jacoco多模块生成java单元测试报告实践 arthas 使用demo LockSupport Exchanger CyclicBarrier CountDownLatch 手把手教你用python开始第一个机器学习项目
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 是一个值得考虑的选择。