diff --git a/scripts/bootstrap_qdrant_exercises.py b/scripts/bootstrap_qdrant_exercises.py new file mode 100644 index 0000000..97c1210 --- /dev/null +++ b/scripts/bootstrap_qdrant_exercises.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Idempotenter Bootstrap für die Qdrant-Collection 'exercises': +- Legt fehlende Payload-Indizes an (ohne Collection zu droppen) +- Optional prüft Dimension/Distanz + +Starten mit +pip install qdrant-client --upgrade +python3 scripts/bootstrap_qdrant_exercises.py + +""" + +import os +from qdrant_client import QdrantClient +from qdrant_client.models import PayloadSchemaType + +QDRANT_HOST = os.getenv("QDRANT_HOST", "localhost") +QDRANT_PORT = int(os.getenv("QDRANT_PORT", "6333")) +COLLECTION = os.getenv("EXERCISE_COLLECTION", "exercises") + +INDEX_SPECS = [ + ("keywords", PayloadSchemaType.KEYWORD), + ("equipment", PayloadSchemaType.KEYWORD), + ("discipline", PayloadSchemaType.KEYWORD), + ("age_group", PayloadSchemaType.KEYWORD), + ("target_group", PayloadSchemaType.KEYWORD), + ("category", PayloadSchemaType.KEYWORD), + ("capability_keys", PayloadSchemaType.KEYWORD), + ("capability_ge1", PayloadSchemaType.KEYWORD), + ("capability_ge2", PayloadSchemaType.KEYWORD), + ("capability_ge3", PayloadSchemaType.KEYWORD), +] + +def main(): + client = QdrantClient(host=QDRANT_HOST, port=QDRANT_PORT) + # Sanity: Collection existiert? + info = client.get_collection(COLLECTION) # wirf Fehler, wenn nicht vorhanden + print(f"[Bootstrap] Collection '{COLLECTION}' gefunden. Vectors={info.config.params.vectors}") + + # Indizes idempotent anlegen + for field, schema in INDEX_SPECS: + try: + client.create_payload_index(collection_name=COLLECTION, + field_name=field, + field_schema=schema) + print(f"[Bootstrap] Index created: {field} ({schema})") + except Exception as e: + # Qdrant wirft hier Exceptions, wenn der Index schon existiert – das ist ok + print(f"[Bootstrap] Index exists or skipped: {field} -> {e}") + + print("[Bootstrap] done.") + +if __name__ == "__main__": + main()