管理
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),
},
})