管理

Qdrant 提供管理工具,可以在运行时修改 Qdrant 实例的行为,而无需手动更改其配置。

锁定

锁定 API 允许用户限制对 Qdrant 进程的操作。需要提及的是

  • 此配置不是持久化的,因此重启后需要重新锁定。
  • 锁定仅适用于单个节点。在分布式部署设置中,需要在所有期望的节点上调用锁定。

锁定请求示例

POST /locks
{
    "error_message": "write is forbidden",
    "write": true
}

写标志启用/禁用写锁定。如果写锁定设置为 true,Qdrant 不允许创建新的集合或向现有存储添加新数据。但是,写锁定下不禁止删除或更新操作。此功能允许管理员阻止 Qdrant 进程使用更多磁盘空间,同时允许用户搜索和删除不必要的数据。

您可以选择提供用于向用户返回错误响应的错误消息。

恢复模式

自 v1.2.0 起可用

恢复模式可以在 Qdrant 反复启动失败的情况下提供帮助。在恢复模式下启动时,Qdrant 仅加载集合元数据以防止内存不足。这使您可以解决内存不足的情况,例如通过删除集合。解决后,Qdrant 可以正常重启以继续运行。

在恢复模式下,集合操作仅限于 删除 集合。这是因为恢复期间仅加载了集合元数据。

要使用 Qdrant Docker 镜像启用恢复模式,必须设置环境变量 QDRANT_ALLOW_RECOVERY_MODE=true。容器会首先尝试正常启动,如果由于内存不足错误导致初始化失败,则会重启进入恢复模式。此行为默认禁用。

如果使用 Qdrant 二进制文件,可以通过在环境变量中设置恢复消息来启用恢复模式,例如 QDRANT__STORAGE__RECOVERY_MODE="我的恢复消息"

严格模式

自 v1.13.0 起可用

严格模式是一项限制集合上的某些类型操作以保护集合的功能。

目标是防止可能导致集合过载的低效使用模式。

当您无法控制正在执行的查询时,此配置可确保服务更具可预测性和响应性。

以下是使用严格模式可以限制的部分操作列表(非详尽)

  • 防止查询未索引的载荷(可能非常慢)
  • 查询中最大过滤条件数量
  • 插入向量时的最大批量大小
  • 最大集合大小(按向量或载荷大小计算)

请参阅 模式定义 以了解所有 strict_mode_config 参数。

一旦超出限制,服务器将返回客户端错误,并包含有关超出限制的信息。

作为配置的一部分,enabled 字段用作动态启用或禁用严格模式的开关。

可以在 创建 集合时启用 strict_mode_config,例如下面所示,以激活 unindexed_filtering_retrieve 限制。

unindexed_filtering_retrieve 设置为 false 可防止对未索引的载荷键进行过滤。

PUT /collections/{collection_name}
{
    "strict_mode_config": {
        "enabled": true,
        "unindexed_filtering_retrieve": false
    }
}
curl -X PUT http://localhost:6333/collections/{collection_name} \
  -H 'Content-Type: application/json' \
  --data-raw '{
    "strict_mode_config": {
        "enabled":" true,
        "unindexed_filtering_retrieve": false
    }
  }'
from qdrant_client import QdrantClient, models

client = QdrantClient(url="http://localhost:6333")

client.create_collection(
    collection_name="{collection_name}",
    strict_mode_config=models.StrictModeConfig(enabled=True, unindexed_filtering_retrieve=false),
)
import { QdrantClient } from "@qdrant/js-client-rest";

const client = new QdrantClient({ host: "localhost", port: 6333 });

client.createCollection("{collection_name}", {
  strict_mode_config: {
    enabled: true,
    unindexed_filtering_retrieve: false,
  },
});
use qdrant_client::Qdrant;
use qdrant_client::qdrant::{CreateCollectionBuilder, StrictModeConfigBuilder};

let client = Qdrant::from_url("http://localhost:6334").build()?;

client
    .create_collection(
        CreateCollectionBuilder::new("{collection_name}")
            .strict_config_mode(StrictModeConfigBuilder::default().enabled(true).unindexed_filtering_retrieve(false)),
    )
    .await?;
import io.qdrant.client.QdrantClient;
import io.qdrant.client.QdrantGrpcClient;
import io.qdrant.client.grpc.Collections.CreateCollection;
import io.qdrant.client.grpc.Collections.StrictModeCOnfig;

QdrantClient client =
    new QdrantClient(QdrantGrpcClient.newBuilder("localhost", 6334, false).build());

client
    .createCollectionAsync(
        CreateCollection.newBuilder()
            .setCollectionName("{collection_name}")
            .setStrictModeConfig(
                StrictModeConfig.newBuilder().setEnabled(true).setUnindexedFilteringRetrieve(false).build())
            .build())
    .get();
using Qdrant.Client;
using Qdrant.Client.Grpc;

var client = new QdrantClient("localhost", 6334);

await client.CreateCollectionAsync(
  collectionName: "{collection_name}",
  strictModeConfig: new StrictModeConfig { enabled = true, unindexed_filtering_retrieve = false }
);
import (
  "context"

  "github.com/qdrant/go-client/qdrant"
)

client, err := qdrant.NewClient(&qdrant.Config{
  Host: "localhost",
  Port: 6334,
})

client.CreateCollection(context.Background(), &qdrant.CreateCollection{
  CollectionName: "{collection_name}",
  StrictModeConfig: &qdrant.StrictModeConfig{
    Enabled: qdrant.PtrOf(true),
    IndexingThreshold: qdrant.PtrOf(false),
  },
})

或者稍后通过 集合更新 API 在现有集合上激活它

PATCH /collections/{collection_name}
{
    "strict_mode_config": {
        "enabled": true,
        "unindexed_filtering_retrieve": false
    }
}
curl -X PATCH http://localhost:6333/collections/{collection_name} \
  -H 'Content-Type: application/json' \
  --data-raw '{
    "strict_mode_config": {
        "enabled": true,
        "unindexed_filtering_retrieve": false
    }
  }'
from qdrant_client import QdrantClient, models

client = QdrantClient(url="http://localhost:6333")

client.update_collection(
    collection_name="{collection_name}",
    strict_mode_config=models.StrictModeConfig(enabled=True, unindexed_filtering_retrieve=False),
)
import { QdrantClient } from "@qdrant/js-client-rest";

const client = new QdrantClient({ host: "localhost", port: 6333 });

client.updateCollection("{collection_name}", {
  strict_mode_config: {
    enabled: true,
    unindexed_filtering_retrieve: false,
  },
});
use qdrant_client::qdrant::{StrictModeConfigBuilder, UpdateCollectionBuilder};

client
    .update_collection(
        UpdateCollectionBuilder::new("{collection_name}").strict_mode_config(
            StrictModeConfigBuilder::default().enabled(true).unindexed_filtering_retrieve(false),
        ),
    )
    .await?;
import io.qdrant.client.grpc.Collections.StrictModeConfigBuilder;
import io.qdrant.client.grpc.Collections.UpdateCollection;

client.updateCollectionAsync(
    UpdateCollection.newBuilder()
        .setCollectionName("{collection_name}")
        .setStrictModeConfig(
            StrictModeConfig.newBuilder().setEnabled(true).setUnindexedFilteringRetrieve(false).build())
        .build());
using Qdrant.Client;
using Qdrant.Client.Grpc;

var client = new QdrantClient("localhost", 6334);

await client.UpdateCollectionAsync(
  collectionName: "{collection_name}",
  strictModeConfig: new StrictModeConfig { Enabled = true, UnindexedFilteringRetrieve = false }
);
import (
  "context"

  "github.com/qdrant/go-client/qdrant"
)

client, err := qdrant.NewClient(&qdrant.Config{
  Host: "localhost",
  Port: 6334,
})

client.UpdateCollection(context.Background(), &qdrant.UpdateCollection{
  CollectionName: "{collection_name}",
  StrictModeConfig: &qdrant.StrictModeConfig{
    Enabled: qdrant.PtrOf(true),
    UnindexedFilteringRetrieve: qdrant.PtrOf(false),
  },
})

要在现有集合上完全禁用严格模式,请使用

PATCH /collections/{collection_name}
{
    "strict_mode_config": {
        "enabled": false
    }
}
curl -X PATCH http://localhost:6333/collections/{collection_name} \
  -H 'Content-Type: application/json' \
  --data-raw '{
    "strict_mode_config": {
        "enabled": false,
    }
  }'
from qdrant_client import QdrantClient, models

client = QdrantClient(url="http://localhost:6333")

client.update_collection(
    collection_name="{collection_name}",
    strict_mode_config=models.StrictModeConfig(enabled=False),
)
import { QdrantClient } from "@qdrant/js-client-rest";

const client = new QdrantClient({ host: "localhost", port: 6333 });

client.updateCollection("{collection_name}", {
  strict_mode_config: {
    enabled: false,
  },
});
use qdrant_client::qdrant::{StrictModeConfigBuilder, UpdateCollectionBuilder};

client
    .update_collection(
        UpdateCollectionBuilder::new("{collection_name}").strict_mode_config(
            StrictModeConfigBuilder::default().enabled(false),
        ),
    )
    .await?;
import io.qdrant.client.grpc.Collections.StrictModeConfigBuilder;
import io.qdrant.client.grpc.Collections.UpdateCollection;

client.updateCollectionAsync(
    UpdateCollection.newBuilder()
        .setCollectionName("{collection_name}")
        .setStrictModeConfig(
            StrictModeConfig.newBuilder().setEnabled(false).build())
        .build());
using Qdrant.Client;
using Qdrant.Client.Grpc;

var client = new QdrantClient("localhost", 6334);

await client.UpdateCollectionAsync(
  collectionName: "{collection_name}",
  strictModeConfig: new StrictModeConfig { Enabled = false }
);
import (
  "context"

  "github.com/qdrant/go-client/qdrant"
)

client, err := qdrant.NewClient(&qdrant.Config{
  Host: "localhost",
  Port: 6334,
})

client.UpdateCollection(context.Background(), &qdrant.UpdateCollection{
  CollectionName: "{collection_name}",
  StrictModeConfig: &qdrant.StrictModeConfig{
        Enabled: qdrant.PtrOf(false),
  },
})
此页面有帮助吗?

感谢您的反馈! 🙏

很抱歉听到此反馈。😔 您可以在 GitHub 上编辑此页面,或创建 GitHub 问题。