diff --git a/elasticsearch/dsl/_async/document.py b/elasticsearch/dsl/_async/document.py index 53b4f12c3..c3631260a 100644 --- a/elasticsearch/dsl/_async/document.py +++ b/elasticsearch/dsl/_async/document.py @@ -126,9 +126,10 @@ def search( Create an :class:`~elasticsearch.dsl.Search` instance that will search over this ``Document``. """ - return AsyncSearch( + s = AsyncSearch[Self]( using=cls._get_using(using), index=cls._default_index(index), doc_type=[cls] ) + return s.source(exclude_vectors=False) @classmethod async def get( diff --git a/elasticsearch/dsl/_sync/document.py b/elasticsearch/dsl/_sync/document.py index 07bda6ec1..c37c7639d 100644 --- a/elasticsearch/dsl/_sync/document.py +++ b/elasticsearch/dsl/_sync/document.py @@ -120,9 +120,10 @@ def search( Create an :class:`~elasticsearch.dsl.Search` instance that will search over this ``Document``. """ - return Search( + s = Search[Self]( using=cls._get_using(using), index=cls._default_index(index), doc_type=[cls] ) + return s.source(exclude_vectors=False) @classmethod def get( diff --git a/elasticsearch/dsl/search_base.py b/elasticsearch/dsl/search_base.py index cd690ddae..c5b12c788 100644 --- a/elasticsearch/dsl/search_base.py +++ b/elasticsearch/dsl/search_base.py @@ -721,14 +721,18 @@ def ensure_strings( def ensure_strings( fields: Union[ + bool, str, "InstrumentedField", List[Union[str, "InstrumentedField"]], Dict[str, List[Union[str, "InstrumentedField"]]], ], - ) -> Union[str, List[str], Dict[str, List[str]]]: + ) -> Union[bool, str, List[str], Dict[str, List[str]]]: if isinstance(fields, dict): return {k: ensure_strings(v) for k, v in fields.items()} + elif isinstance(fields, bool): + # boolean settings should stay the way they are + return fields elif not isinstance(fields, (str, InstrumentedField)): # we assume that if `fields` is not a any of [dict, str, # InstrumentedField] then it is an iterable of strings or diff --git a/test_elasticsearch/test_dsl/_async/test_document.py b/test_elasticsearch/test_dsl/_async/test_document.py index c986e588e..a110d1caf 100644 --- a/test_elasticsearch/test_dsl/_async/test_document.py +++ b/test_elasticsearch/test_dsl/_async/test_document.py @@ -821,10 +821,9 @@ class TypedDocAnnotated(AsyncDocument): s = doc_class.search().sort(doc_class.st, -doc_class.dt, +doc_class.ob.st) s.aggs.bucket("terms_agg", "terms", field=doc_class.k1) - assert s.to_dict() == { - "aggs": {"terms_agg": {"terms": {"field": "k1"}}}, - "sort": ["st", {"dt": {"order": "desc"}}, "ob.st"], - } + d = s.to_dict() + assert d["aggs"] == {"terms_agg": {"terms": {"field": "k1"}}} + assert d["sort"] == ["st", {"dt": {"order": "desc"}}, "ob.st"] @pytest.mark.skipif(sys.version_info < (3, 10), reason="requires Python 3.10") diff --git a/test_elasticsearch/test_dsl/_sync/test_document.py b/test_elasticsearch/test_dsl/_sync/test_document.py index c4e0cc31a..a4f88e501 100644 --- a/test_elasticsearch/test_dsl/_sync/test_document.py +++ b/test_elasticsearch/test_dsl/_sync/test_document.py @@ -821,10 +821,9 @@ class TypedDocAnnotated(Document): s = doc_class.search().sort(doc_class.st, -doc_class.dt, +doc_class.ob.st) s.aggs.bucket("terms_agg", "terms", field=doc_class.k1) - assert s.to_dict() == { - "aggs": {"terms_agg": {"terms": {"field": "k1"}}}, - "sort": ["st", {"dt": {"order": "desc"}}, "ob.st"], - } + d = s.to_dict() + assert d["aggs"] == {"terms_agg": {"terms": {"field": "k1"}}} + assert d["sort"] == ["st", {"dt": {"order": "desc"}}, "ob.st"] @pytest.mark.skipif(sys.version_info < (3, 10), reason="requires Python 3.10") diff --git a/test_elasticsearch/test_dsl/test_integration/_async/test_document.py b/test_elasticsearch/test_dsl/test_integration/_async/test_document.py index 274db1027..0dd0de0ca 100644 --- a/test_elasticsearch/test_dsl/test_integration/_async/test_document.py +++ b/test_elasticsearch/test_dsl/test_integration/_async/test_document.py @@ -864,7 +864,7 @@ async def test_dense_vector( class Doc(AsyncDocument): float_vector: List[float] = mapped_field(DenseVector()) byte_vector: List[int] = mapped_field(DenseVector(element_type="byte")) - bit_vector: str = mapped_field(DenseVector(element_type="bit")) + bit_vector: List[int] = mapped_field(DenseVector(element_type="bit")) class Index: name = "vectors" @@ -873,13 +873,15 @@ class Index: await Doc.init() doc = Doc( - float_vector=[1.0, 1.2, 2.3], byte_vector=[12, 23, 34, 45], bit_vector="12abf0" + float_vector=[1.0, 1.2, 2.3], + byte_vector=[12, 23, 34, 45], + bit_vector=[18, -43, -112], ) await doc.save(refresh=True) docs = await Doc.search().execute() assert len(docs) == 1 - assert docs[0].float_vector == doc.float_vector + assert [round(v, 1) for v in docs[0].float_vector] == doc.float_vector assert docs[0].byte_vector == doc.byte_vector assert docs[0].bit_vector == doc.bit_vector diff --git a/test_elasticsearch/test_dsl/test_integration/_sync/test_document.py b/test_elasticsearch/test_dsl/test_integration/_sync/test_document.py index 62857cd9a..ce6ac03ad 100644 --- a/test_elasticsearch/test_dsl/test_integration/_sync/test_document.py +++ b/test_elasticsearch/test_dsl/test_integration/_sync/test_document.py @@ -852,7 +852,7 @@ def test_dense_vector(client: Elasticsearch, es_version: Tuple[int, ...]) -> Non class Doc(Document): float_vector: List[float] = mapped_field(DenseVector()) byte_vector: List[int] = mapped_field(DenseVector(element_type="byte")) - bit_vector: str = mapped_field(DenseVector(element_type="bit")) + bit_vector: List[int] = mapped_field(DenseVector(element_type="bit")) class Index: name = "vectors" @@ -861,13 +861,15 @@ class Index: Doc.init() doc = Doc( - float_vector=[1.0, 1.2, 2.3], byte_vector=[12, 23, 34, 45], bit_vector="12abf0" + float_vector=[1.0, 1.2, 2.3], + byte_vector=[12, 23, 34, 45], + bit_vector=[18, -43, -112], ) doc.save(refresh=True) docs = Doc.search().execute() assert len(docs) == 1 - assert docs[0].float_vector == doc.float_vector + assert [round(v, 1) for v in docs[0].float_vector] == doc.float_vector assert docs[0].byte_vector == doc.byte_vector assert docs[0].bit_vector == doc.bit_vector