mirror of
https://github.com/qdrant/qdrant.git
synced 2026-07-23 11:11:00 -05:00
103 lines
3.9 KiB
Python
103 lines
3.9 KiB
Python
import uuid
|
|
import random
|
|
|
|
from qdrant_client import models
|
|
from e2e_tests.client_utils import ClientUtils
|
|
from e2e_tests.models import QdrantContainerConfig
|
|
|
|
|
|
class TestImmutableIndex:
|
|
"""Test Qdrant immutable index functionality."""
|
|
|
|
def test_immutable_full_text_index(self, qdrant_container_factory):
|
|
"""
|
|
Test scenario:
|
|
1. Create a collection with specific configuration
|
|
2. Add multiple payload indexes
|
|
3. Insert 100 points
|
|
4. Verify points count matches in collection and all indexes
|
|
"""
|
|
config = QdrantContainerConfig()
|
|
container_info = qdrant_container_factory(config)
|
|
|
|
client = ClientUtils(host=container_info.host, port=container_info.http_port)
|
|
assert client.wait_for_server(), "Server failed to start"
|
|
|
|
collection_name = "test_immutable_index"
|
|
|
|
# 1. Create collection with specific configuration
|
|
vector_dim = 256
|
|
collection_config = {
|
|
"vectors": {
|
|
"size": vector_dim,
|
|
"distance": "Cosine"
|
|
},
|
|
"on_disk_payload": False, # True in example issue
|
|
"optimizers_config": {
|
|
"indexing_threshold": 1,
|
|
}
|
|
}
|
|
client.create_collection(collection_name, collection_config)
|
|
|
|
# 2. Create payload indexes using ClientUtils method
|
|
client.create_payload_index(
|
|
collection_name=collection_name,
|
|
field_name="chunk_id",
|
|
field_schema=models.PayloadSchemaType.UUID
|
|
)
|
|
|
|
client.create_payload_index(
|
|
collection_name=collection_name,
|
|
field_name="text",
|
|
field_schema=models.TextIndexParams(
|
|
type=models.TextIndexType.TEXT,
|
|
tokenizer=models.TokenizerType.WORD,
|
|
min_token_len=2,
|
|
max_token_len=15,
|
|
lowercase=True
|
|
)
|
|
)
|
|
|
|
# 3. Insert 100 points
|
|
points = []
|
|
vectors_count = 100
|
|
for i in range(vectors_count):
|
|
point = models.PointStruct(
|
|
id=i,
|
|
vector=[round(random.uniform(0, 1), 2) for _ in range(vector_dim)],
|
|
payload={
|
|
"chunk_id": str(uuid.uuid4()),
|
|
"library_id": str(uuid.uuid4()),
|
|
"folder_id": str(uuid.uuid4()),
|
|
"text": f"This is test text number {i} with some random words for indexing",
|
|
"media_id": str(uuid.uuid4())
|
|
}
|
|
)
|
|
points.append(point)
|
|
|
|
client.client.upsert(
|
|
collection_name=collection_name,
|
|
points=points,
|
|
wait=True
|
|
)
|
|
|
|
status_result = client.wait_for_status(collection_name, "green")
|
|
assert status_result == "ok", f"Collection did not reach green status within timeout"
|
|
|
|
# 4. Verify points count using collection metadata
|
|
collection_data = client.get_collection_info_dict(collection_name)
|
|
|
|
collection_points_count = collection_data["result"]["points_count"]
|
|
assert collection_points_count == vectors_count, f"Expected {vectors_count} points in collection, got {collection_points_count}"
|
|
|
|
# Check payload schema exists and has expected number of points
|
|
payload_schema = collection_data["result"].get("payload_schema", {})
|
|
expected_fields = ["chunk_id", "text"]
|
|
for field in expected_fields:
|
|
assert field in payload_schema, f"Expected field '{field}' not found in payload schema"
|
|
|
|
field_info = payload_schema[field]
|
|
# Check that each indexed field has the expected number of points
|
|
# The points count in the payload schema should equal the collection points count
|
|
assert field_info.points == vectors_count, f"Expected {vectors_count} points in index '{field}', got {field_info.points}"
|