add is_tenant to multitenancy docs (#1076)

* add is_tenant to multitenancy docs

* fix alert

* fix alert

* update python snippet
This commit is contained in:
Andrey Vasnetsov
2024-08-12 21:27:25 +02:00
committed by GitHub
parent 217c5aeab8
commit 6f139caada
@@ -404,11 +404,19 @@ await client.CreateCollectionAsync(
3. Create keyword payload index for `group_id` field. 3. Create keyword payload index for `group_id` field.
<aside role="alert">
<code>is_tenant</code> parameter is available as of v1.11.0. Previous versions should use default options for keyword index creation.
</aside>
```http ```http
PUT /collections/{collection_name}/index PUT /collections/{collection_name}/index
{ {
"field_name": "group_id", "field_name": "group_id",
"field_schema": "keyword" "field_schema": {
"type": "keyword",
"is_tenant": true
}
} }
``` ```
@@ -416,43 +424,69 @@ PUT /collections/{collection_name}/index
client.create_payload_index( client.create_payload_index(
collection_name="{collection_name}", collection_name="{collection_name}",
field_name="group_id", field_name="group_id",
field_schema=models.PayloadSchemaType.KEYWORD, field_schema=models.KeywordIndexParams(
type="keywprd",
is_tenant=True,
),
) )
``` ```
```typescript ```typescript
client.createPayloadIndex("{collection_name}", { client.createPayloadIndex("{collection_name}", {
field_name: "group_id", field_name: "group_id",
field_schema: "keyword", field_schema: {
type: "keyword",
is_tenant: true,
},
}); });
``` ```
```rust ```rust
use qdrant_client::qdrant::{CreateFieldIndexCollectionBuilder, FieldType}; use qdrant_client::qdrant::{
CreateFieldIndexCollectionBuilder,
KeywordIndexParamsBuilder,
FieldType
};
use qdrant_client::{Qdrant, QdrantError}; use qdrant_client::{Qdrant, QdrantError};
let client = Qdrant::from_url("http://localhost:6334").build()?; let client = Qdrant::from_url("http://localhost:6334").build()?;
client client.create_field_index(
.create_field_index(CreateFieldIndexCollectionBuilder::new( CreateFieldIndexCollectionBuilder::new(
"{collection_name}", "{collection_name}",
"group_id", "group_id",
FieldType::Keyword, FieldType::Keyword,
)) ).field_index_params(
.await?; KeywordIndexParamsBuilder::default()
.is_tenant(true)
)
).await?;
``` ```
```java ```java
import io.qdrant.client.QdrantClient; import io.qdrant.client.QdrantClient;
import io.qdrant.client.QdrantGrpcClient; import io.qdrant.client.QdrantGrpcClient;
import io.qdrant.client.grpc.Collections.PayloadIndexParams;
import io.qdrant.client.grpc.Collections.PayloadSchemaType; import io.qdrant.client.grpc.Collections.PayloadSchemaType;
import io.qdrant.client.grpc.Collections.KeywordIndexParams;
QdrantClient client = QdrantClient client =
new QdrantClient(QdrantGrpcClient.newBuilder("localhost", 6334, false).build()); new QdrantClient(QdrantGrpcClient.newBuilder("localhost", 6334, false).build());
client client
.createPayloadIndexAsync( .createPayloadIndexAsync(
"{collection_name}", "group_id", PayloadSchsemaType.Keyword, null, null, null, null) "{collection_name}",
"group_id",
PayloadSchemaType.Keyword,
PayloadIndexParams.newBuilder()
.setKeywordIndexParams(
KeywordIndexParams.newBuilder()
.setIsTenant(true)
.build())
.build(),
null,
null,
null)
.get(); .get();
``` ```
@@ -461,9 +495,25 @@ using Qdrant.Client;
var client = new QdrantClient("localhost", 6334); var client = new QdrantClient("localhost", 6334);
await client.CreatePayloadIndexAsync(collectionName: "{collection_name}", fieldName: "group_id"); await client.CreatePayloadIndexAsync(
collectionName: "{collection_name}",
fieldName: "group_id",
schemaType: PayloadSchemaType.Keyword,
indexParams: new PayloadIndexParams
{
KeywordIndexParams = new KeywordIndexParams
{
IsTenant = true
}
}
);
``` ```
`is_tenant=true` parameter is optional, but specifying it provides storage with additional inforamtion about the usage patterns the collection is going to use.
When specified, storage structure will be organized in a way to co-locate vectors of the same tenant together, which can significantly improve performance in some cases.
## Limitations ## Limitations
One downside to this approach is that global requests (without the `group_id` filter) will be slower since they will necessitate scanning all groups to identify the nearest neighbors. One downside to this approach is that global requests (without the `group_id` filter) will be slower since they will necessitate scanning all groups to identify the nearest neighbors.