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]}'