QdrantAdapter
What it is
- An
IVectorStorePortimplementation backed by Qdrant viaqdrant-client. - Manages collection lifecycle and CRUD/search operations for vector documents.
Public API
Class: QdrantAdapter(IVectorStorePort)
Constructor
__init__(host="localhost", port=6333, api_key=None, https=False, timeout=300)- Stores connection parameters; does not connect until
initialize().
- Stores connection parameters; does not connect until
Connection lifecycle
initialize() -> None- Creates an internal
QdrantClientif not already created.
- Creates an internal
close() -> None- Closes the underlying client and clears it.
Collections
create_collection(collection_name: str, dimension: int, distance_metric: str = "cosine", **kwargs) -> None- Creates a Qdrant collection with a single vector field of given
dimensionand metric (cosine,euclidean,dot; defaults to cosine).
- Creates a Qdrant collection with a single vector field of given
delete_collection(collection_name: str) -> None- Deletes the collection.
list_collections() -> List[str]- Returns all collection names.
Vectors / documents
-
store_vectors(collection_name: str, documents: List[VectorDocument]) -> None- Upserts points into the collection.
- Stores:
doc.metadataas top-level payload fields (if provided)doc.payloadunder payload key"payload"(if provided)
- Raises
RuntimeErrorif Qdrant upsert does not complete.
-
search(collection_name: str, query_vector: np.ndarray, k: int = 10, filter: Optional[Dict[str, Any]] = None, include_vectors: bool = False, include_metadata: bool = True) -> List[SearchResult]- Executes a vector similarity search.
- Optional
filteris translated into QdrantFilter(must=[FieldCondition(...), ...])with exactMatchValue. - Controls:
include_vectors: returns vectors in results whenTrueinclude_metadata: returns payload asmetadatawhenTrue
- Also extracts
payloadfrom the stored"payload"key (if present).
-
get_vector(collection_name: str, vector_id: str, include_vector: bool = True) -> Optional[VectorDocument]- Retrieves a single point by id.
- Returns
Noneif not found. - Separates
"payload"from other payload keys:VectorDocument.metadata= payload without"payload"VectorDocument.payload= payload["payload"] (if present)
-
update_vector(collection_name: str, vector_id: str, vector: Optional[np.ndarray] = None, metadata: Optional[Dict[str, Any]] = None, payload: Optional[Dict[str, Any]] = None) -> None- Updates vector values when
vectoris provided. - Updates payload when
metadataand/orpayloadare provided:metadatamerged into payloadpayloadstored under"payload"key
- Updates vector values when
-
delete_vectors(collection_name: str, vector_ids: List) -> None- Deletes multiple points by id.
-
count_vectors(collection_name: str) -> int- Returns
indexed_vectors_countfor the collection (or0if missing).
- Returns
Configuration/Dependencies
- Requires:
qdrant-clientnumpy
- Connection parameters:
host,port, optionalapi_key,https,timeout
- Must call
initialize()before any operation; otherwise methods raiseRuntimeError("Adapter not initialized").
Usage
import numpy as np
from naas_abi_core.services.vector_store.adapters.QdrantAdapter import QdrantAdapter
from naas_abi_core.services.vector_store.IVectorStorePort import VectorDocument
adapter = QdrantAdapter(host="localhost", port=6333)
adapter.initialize()
collection = "example"
dim = 3
adapter.create_collection(collection_name=collection, dimension=dim, distance_metric="cosine")
docs = [
VectorDocument(id="1", vector=np.array([0.1, 0.2, 0.3]), metadata={"type": "a"}, payload={"text": "hello"}),
VectorDocument(id="2", vector=np.array([0.0, 0.1, 0.0]), metadata={"type": "b"}, payload={"text": "world"}),
]
adapter.store_vectors(collection, docs)
results = adapter.search(
collection_name=collection,
query_vector=np.array([0.1, 0.2, 0.25]),
k=2,
filter={"type": "a"},
include_vectors=False,
include_metadata=True,
)
print([(r.id, r.score, r.metadata, r.payload) for r in results])
doc = adapter.get_vector(collection, "1", include_vector=True)
print(doc.id, doc.vector.tolist(), doc.metadata, doc.payload)
adapter.close()
Caveats
- Filtering only supports exact-match constraints via
MatchValuefor eachfilterentry; no range/complex filters are implemented here. count_vectors()usesindexed_vectors_count, which may differ from total points depending on Qdrant indexing/state.get_vector(..., include_vector=False)returns an emptynp.array([])for the vector field (because the adapter constructs it from missing data).