diff --git a/docarray/index/backends/qdrant.py b/docarray/index/backends/qdrant.py index 12edce02791..a81587ef571 100644 --- a/docarray/index/backends/qdrant.py +++ b/docarray/index/backends/qdrant.py @@ -612,7 +612,11 @@ def _convert_to_doc( self, point: Union[rest.ScoredPoint, rest.Record] ) -> Dict[str, Any]: document = cast(Dict[str, Any], point.payload) - generated_vectors = document.pop('__generated_vectors') + generated_vectors = ( + document.pop('__generated_vectors') + if '__generated_vectors' in document + else [] + ) vectors = point.vector if point.vector else dict() if not isinstance(vectors, dict): vectors = {'__default__': vectors} diff --git a/tests/index/qdrant/fixtures.py b/tests/index/qdrant/fixtures.py index d48372ad0f0..77ba67dafe2 100644 --- a/tests/index/qdrant/fixtures.py +++ b/tests/index/qdrant/fixtures.py @@ -29,7 +29,8 @@ def tmp_collection_name(): def qdrant() -> qdrant_client.QdrantClient: """This fixture takes care of removing the collection before each test case""" client = qdrant_client.QdrantClient(path='/tmp/qdrant-local') - client.delete_collection(collection_name='documents') + for collection in client.get_collections().collections: + client.delete_collection(collection.name) return client diff --git a/tests/index/qdrant/test_external_collection.py b/tests/index/qdrant/test_external_collection.py new file mode 100644 index 00000000000..ec9be75cea0 --- /dev/null +++ b/tests/index/qdrant/test_external_collection.py @@ -0,0 +1,64 @@ +from docarray import BaseDoc +from docarray.index import QdrantDocumentIndex +from docarray.typing import NdArray +from tests.index.qdrant.fixtures import qdrant, qdrant_config # noqa: F401 + +from qdrant_client.http import models + + +def test_external_collection_without_generated_vectors(qdrant_config): + class Restaurant(BaseDoc): + city: str + price: float + cuisine_vector: NdArray[4] + + qdrant_config.collection_name = 'test' + doc_index = QdrantDocumentIndex[Restaurant](qdrant_config) + qdrant_client = doc_index._client + + qdrant_client.recreate_collection( + collection_name='test', + vectors_config={ + 'cuisine_vector': models.VectorParams( + size=4, distance=models.Distance.COSINE + ) + }, + ) + + qdrant_client.upsert( + collection_name='test', + points=[ + models.PointStruct( + id=1, + vector={'cuisine_vector': [0.05, 0.61, 0.76, 0.74]}, + payload={ + 'city': 'Berlin', + 'price': 1.99, + }, + ), + models.PointStruct( + id=2, + vector={'cuisine_vector': [0.19, 0.81, 0.75, 0.11]}, + payload={ + 'city': 'Berlin', + 'price': 1.99, + }, + ), + models.PointStruct( + id=3, + vector={'cuisine_vector': [0.36, 0.55, 0.47, 0.94]}, + payload={ + 'city': 'Moscow', + 'price': 1.99, + }, + ), + ], + ) + + results = doc_index.find( + query=[0.36, 0.55, 0.47, 0.94], + search_field='cuisine_vector', + limit=3, + ) + + assert results is not None