Technical note
Qdrant的Docker启动与RESTAPI常用操作
本地调试Qdrant时,用Docker启动服务,再直接通过RESTAPI操作Collection和Point就足够了。查询接口已经统一到QueryAPI,旧的Search接口不再继续使用。
参考
Docker启动
示例使用v1.19.0:
docker run --rm \
--name qdrant \
-p 127.0.0.1:6333:6333 \
-p 127.0.0.1:6334:6334 \
-v "$PWD/qdrant_storage:/qdrant/storage" \
qdrant/qdrant:v1.19.0
- RESTAPI:
http://localhost:6333 - WebUI:
http://localhost:6333/dashboard - gRPC:
localhost:6334
DockerCompose配置:
services:
qdrant:
image: qdrant/qdrant:v1.19.0
container_name: qdrant
ports:
- "127.0.0.1:6333:6333"
- "127.0.0.1:6334:6334"
volumes:
- ./qdrant_storage:/qdrant/storage
自建Qdrant默认没有认证和TLS,所以这里只绑定到127.0.0.1。需要从其他机器访问时,先配置APIKey、TLS或带鉴权的反向代理,不要直接把6333和6334端口暴露到公网。
下面的RESTAPI示例都使用本机地址:
export QDRANT_URL=http://localhost:6333
Collection
列出Collection:
curl -sS "$QDRANT_URL/collections"
创建一个4维向量的Collection:
curl -sS -X PUT \
"$QDRANT_URL/collections/test_collection" \
-H 'Content-Type: application/json' \
-d '{
"vectors": {
"size": 4,
"distance": "Cosine"
}
}'
查看Collection和检查是否存在:
curl -sS "$QDRANT_URL/collections/test_collection"
curl -sS "$QDRANT_URL/collections/test_collection/exists"
创建别名:
curl -sS -X POST \
"$QDRANT_URL/collections/aliases" \
-H 'Content-Type: application/json' \
-d '{
"actions": [
{
"create_alias": {
"collection_name": "test_collection",
"alias_name": "production_collection"
}
}
]
}'
Point
批量写入3个Point:
curl -sS -X PUT \
"$QDRANT_URL/collections/test_collection/points?wait=true" \
-H 'Content-Type: application/json' \
-d '{
"points": [
{
"id": 1,
"payload": {"color": "red", "city": "Beijing"},
"vector": [0.9, 0.1, 0.1, 0.2]
},
{
"id": 2,
"payload": {"color": "green", "city": "Shanghai"},
"vector": [0.1, 0.9, 0.1, 0.2]
},
{
"id": 3,
"payload": {"color": "blue", "city": "Beijing"},
"vector": [0.1, 0.1, 0.9, 0.2]
}
]
}'
Scroll查询
Scroll不计算向量相似度,适合按条件遍历Point:
curl -sS -X POST \
"$QDRANT_URL/collections/test_collection/points/scroll" \
-H 'Content-Type: application/json' \
-d '{
"limit": 10,
"filter": {
"must": [
{
"key": "city",
"match": {"value": "Beijing"}
}
]
},
"with_payload": true,
"with_vector": false
}'
返回结果中的next_page_offset可以作为下一次请求的offset。
向量查询
points/search属于旧接口,向量查询改用QueryAPI:
curl -sS -X POST \
"$QDRANT_URL/collections/test_collection/points/query" \
-H 'Content-Type: application/json' \
-d '{
"query": [0.2, 0.1, 0.9, 0.7],
"filter": {
"must": [
{
"key": "city",
"match": {"value": "Beijing"}
}
]
},
"params": {
"hnsw_ef": 128,
"exact": false
},
"limit": 3,
"with_payload": true
}'
也可以使用已有Point的ID作为查询向量:
curl -sS -X POST \
"$QDRANT_URL/collections/test_collection/points/query" \
-H 'Content-Type: application/json' \
-d '{
"query": 2,
"limit": 3,
"with_payload": true
}'
统计
curl -sS -X POST \
"$QDRANT_URL/collections/test_collection/points/count" \
-H 'Content-Type: application/json' \
-d '{
"filter": {
"must": [
{
"key": "city",
"match": {"value": "Beijing"}
}
]
},
"exact": true
}'
删除Point
按ID删除Point:
curl -sS -X POST \
"$QDRANT_URL/collections/test_collection/points/delete?wait=true" \
-H 'Content-Type: application/json' \
-d '{"points": [1, 3]}'