Skip to content

Commit e7490fa

Browse files
authored
Merge pull request #1209 from sanders41/meilisearch-1.13.0
Update for Meilisearch v1.13.0
2 parents da093d2 + 52e8cf9 commit e7490fa

File tree

9 files changed

+97
-27
lines changed

9 files changed

+97
-27
lines changed

meilisearch_python_sdk/_client.py

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -623,15 +623,18 @@ async def multi_search(
623623
>>> search_results = await client.search(queries)
624624
"""
625625
url = "multi-search"
626-
if federation:
627-
processed_queries = []
628-
for query in queries:
629-
q = query.model_dump(by_alias=True)
626+
processed_queries = []
627+
for query in queries:
628+
q = query.model_dump(by_alias=True)
629+
630+
if query.retrieve_vectors is None:
631+
del q["retrieveVectors"]
632+
633+
if federation:
630634
del q["limit"]
631635
del q["offset"]
632-
processed_queries.append(q)
633-
else:
634-
processed_queries = [x.model_dump(by_alias=True) for x in queries]
636+
637+
processed_queries.append(q)
635638

636639
if federation:
637640
federation_payload = federation.model_dump(by_alias=True)
@@ -1479,15 +1482,18 @@ def multi_search(
14791482
>>> search_results = client.search(queries)
14801483
"""
14811484
url = "multi-search"
1482-
if federation:
1483-
processed_queries = []
1484-
for query in queries:
1485-
q = query.model_dump(by_alias=True)
1485+
processed_queries = []
1486+
for query in queries:
1487+
q = query.model_dump(by_alias=True)
1488+
1489+
if query.retrieve_vectors is None:
1490+
del q["retrieveVectors"]
1491+
1492+
if federation:
14861493
del q["limit"]
14871494
del q["offset"]
1488-
processed_queries.append(q)
1489-
else:
1490-
processed_queries = [x.model_dump(by_alias=True) for x in queries]
1495+
1496+
processed_queries.append(q)
14911497

14921498
if federation:
14931499
federation_payload = federation.model_dump(by_alias=True)

meilisearch_python_sdk/index.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -721,6 +721,7 @@ async def search(
721721
vector: list[float] | None = None,
722722
hybrid: Hybrid | None = None,
723723
locales: list[str] | None = None,
724+
retrieve_vectors: bool | None = None,
724725
) -> SearchResults:
725726
"""Search the index.
726727
@@ -781,6 +782,7 @@ async def search(
781782
with caution.
782783
locales: Specifies the languages for the search. This parameter can only be used with
783784
Milisearch >= v1.10.0. Defaults to None letting the Meilisearch pick.
785+
retrieve_vectors: Return document vector data with search result.
784786
785787
Returns:
786788
Results of the search
@@ -824,6 +826,7 @@ async def search(
824826
hybrid=hybrid,
825827
ranking_score_threshold=ranking_score_threshold,
826828
locales=locales,
829+
retrieve_vectors=retrieve_vectors,
827830
)
828831
search_url = f"{self._base_url_with_uid}/search"
829832

@@ -986,6 +989,7 @@ async def facet_search(
986989
ranking_score_threshold: float | None = None,
987990
vector: list[float] | None = None,
988991
locales: list[str] | None = None,
992+
retrieve_vectors: bool | None = None,
989993
) -> FacetSearchResults:
990994
"""Search the index.
991995
@@ -1038,6 +1042,7 @@ async def facet_search(
10381042
with caution.
10391043
locales: Specifies the languages for the search. This parameter can only be used with
10401044
Milisearch >= v1.10.0. Defaults to None letting the Meilisearch pick.
1045+
retrieve_vectors: Return document vector data with search result.
10411046
10421047
Returns:
10431048
Results of the search
@@ -1085,6 +1090,7 @@ async def facet_search(
10851090
ranking_score_threshold=ranking_score_threshold,
10861091
vector=vector,
10871092
locales=locales,
1093+
retrieve_vectors=retrieve_vectors,
10881094
)
10891095
search_url = f"{self._base_url_with_uid}/facet-search"
10901096

@@ -5085,6 +5091,7 @@ def search(
50855091
vector: list[float] | None = None,
50865092
hybrid: Hybrid | None = None,
50875093
locales: list[str] | None = None,
5094+
retrieve_vectors: bool | None = None,
50885095
) -> SearchResults:
50895096
"""Search the index.
50905097
@@ -5145,6 +5152,7 @@ def search(
51455152
with caution.
51465153
locales: Specifies the languages for the search. This parameter can only be used with
51475154
Milisearch >= v1.10.0. Defaults to None letting the Meilisearch pick.
5155+
retrieve_vectors: Return document vector data with search result.
51485156
51495157
Returns:
51505158
Results of the search
@@ -5188,6 +5196,7 @@ def search(
51885196
hybrid=hybrid,
51895197
ranking_score_threshold=ranking_score_threshold,
51905198
locales=locales,
5199+
retrieve_vectors=retrieve_vectors,
51915200
)
51925201

51935202
if self._pre_search_plugins:
@@ -5256,6 +5265,7 @@ def facet_search(
52565265
ranking_score_threshold: float | None = None,
52575266
vector: list[float] | None = None,
52585267
locales: list[str] | None = None,
5268+
retrieve_vectors: bool | None = None,
52595269
) -> FacetSearchResults:
52605270
"""Search the index.
52615271
@@ -5308,6 +5318,7 @@ def facet_search(
53085318
with caution.
53095319
locales: Specifies the languages for the search. This parameter can only be used with
53105320
Milisearch >= v1.10.0. Defaults to None letting the Meilisearch pick.
5321+
retrieve_vectors: Return document vector data with search result.
53115322
53125323
Returns:
53135324
Results of the search
@@ -5355,6 +5366,7 @@ def facet_search(
53555366
ranking_score_threshold=ranking_score_threshold,
53565367
vector=vector,
53575368
locales=locales,
5369+
retrieve_vectors=retrieve_vectors,
53585370
)
53595371

53605372
if self._pre_facet_search_plugins:
@@ -8262,6 +8274,7 @@ def _process_search_parameters(
82628274
vector: list[float] | None = None,
82638275
hybrid: Hybrid | None = None,
82648276
locales: list[str] | None = None,
8277+
retrieve_vectors: bool | None = None,
82658278
) -> JsonDict:
82668279
if attributes_to_retrieve is None:
82678280
attributes_to_retrieve = ["*"]
@@ -8310,6 +8323,9 @@ def _process_search_parameters(
83108323
if locales:
83118324
body["locales"] = locales
83128325

8326+
if retrieve_vectors is not None:
8327+
body["retrieveVectors"] = retrieve_vectors
8328+
83138329
return body
83148330

83158331

meilisearch_python_sdk/models/search.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ class SearchParams(CamelBase):
7070
vector: list[float] | None = None
7171
hybrid: Hybrid | None = None
7272
locales: list[str] | None = None
73+
retrieve_vectors: bool | None = None
7374

7475
@field_validator("ranking_score_threshold", mode="before") # type: ignore[attr-defined]
7576
@classmethod

meilisearch_python_sdk/models/settings.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ class OpenAiEmbedder(CamelBase):
5656
document_template: str | None = None
5757
document_template_max_bytes: int | None = None
5858
distribution: Distribution | None = None
59+
binary_quantized: bool | None = None
5960

6061

6162
class HuggingFaceEmbedder(CamelBase):
@@ -65,6 +66,8 @@ class HuggingFaceEmbedder(CamelBase):
6566
document_template: str | None = None
6667
document_template_max_bytes: int | None = None
6768
distribution: Distribution | None = None
69+
dimensions: int | None = None
70+
binary_quantized: bool | None = None
6871

6972

7073
class OllamaEmbedder(CamelBase):
@@ -76,6 +79,7 @@ class OllamaEmbedder(CamelBase):
7679
document_template: str | None = None
7780
document_template_max_bytes: int | None = None
7881
distribution: Distribution | None = None
82+
binary_quantized: bool | None = None
7983

8084

8185
class RestEmbedder(CamelBase):
@@ -89,12 +93,16 @@ class RestEmbedder(CamelBase):
8993
headers: JsonDict | None = None
9094
request: JsonDict
9195
response: JsonDict
96+
binary_quantized: bool | None = None
9297

9398

9499
class UserProvidedEmbedder(CamelBase):
95100
source: str = "userProvided"
96101
dimensions: int
97102
distribution: Distribution | None = None
103+
document_template: str | None = None
104+
document_template_max_bytes: int | None = None
105+
binary_quantized: bool | None = None
98106

99107

100108
class Embedders(CamelBase):

tests/conftest.py

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -295,15 +295,6 @@ async def default_search_key(async_client):
295295
return key
296296

297297

298-
@pytest.fixture(scope="session", autouse=True)
299-
async def enable_vector_search(base_url, ssl_verify):
300-
async with HttpxAsyncClient(
301-
base_url=base_url, headers={"Authorization": f"Bearer {MASTER_KEY}"}, verify=ssl_verify
302-
) as client:
303-
await client.patch("/experimental-features", json={"vectorStore": True})
304-
yield
305-
306-
307298
@pytest.fixture(scope="session", autouse=True)
308299
async def enable_edit_by_function(base_url, ssl_verify):
309300
async with HttpxAsyncClient(

tests/test_async_index.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ async def test_get_settings_default(
139139
assert response.non_separator_tokens == []
140140
assert response.search_cutoff_ms is None
141141
assert response.dictionary == []
142-
assert response.embedders is None
142+
assert response.embedders == {}
143143
assert response.facet_search is True
144144
assert response.prefix_search == "indexingTime"
145145

@@ -233,7 +233,7 @@ async def test_reset_settings(async_empty_index, new_settings, default_ranking_r
233233
assert response.faceting.max_values_per_facet == 100
234234
assert response.pagination.max_total_hits == 1000
235235
assert response.proximity_precision is ProximityPrecision.BY_WORD
236-
assert response.embedders is None
236+
assert response.embedders == {}
237237

238238

239239
async def test_get_ranking_rules_default(async_empty_index, default_ranking_rules):

tests/test_async_search.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,30 @@ async def test_vector_search(async_index_with_documents_and_vectors):
506506
assert len(response.hits) >= 1
507507

508508

509+
async def test_vector_search_retrieve_vectors(async_index_with_documents_and_vectors):
510+
index = await async_index_with_documents_and_vectors()
511+
response = await index.search(
512+
"",
513+
vector=[0.1, 0.2],
514+
hybrid=Hybrid(semantic_ratio=1.0, embedder="default"),
515+
retrieve_vectors=True,
516+
)
517+
assert len(response.hits) >= 1
518+
assert response.hits[0].get("_vectors") is not None
519+
520+
521+
async def test_vector_search_retrieve_vectors_false(async_index_with_documents_and_vectors):
522+
index = await async_index_with_documents_and_vectors()
523+
response = await index.search(
524+
"",
525+
vector=[0.1, 0.2],
526+
hybrid=Hybrid(semantic_ratio=1.0, embedder="default"),
527+
retrieve_vectors=False,
528+
)
529+
assert len(response.hits) >= 1
530+
assert response.hits[0].get("_vectors") is None
531+
532+
509533
async def test_basic_facet_search(async_index_with_documents):
510534
index = await async_index_with_documents()
511535
update = await index.update_filterable_attributes(["genre"])

tests/test_index.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ def test_get_settings_default(
131131
assert response.non_separator_tokens == []
132132
assert response.search_cutoff_ms is None
133133
assert response.dictionary == []
134-
assert response.embedders is None
134+
assert response.embedders == {}
135135
assert response.facet_search is True
136136
assert response.prefix_search == "indexingTime"
137137

@@ -225,7 +225,7 @@ def test_reset_settings(empty_index, new_settings, default_ranking_rules):
225225
assert response.faceting.max_values_per_facet == 100
226226
assert response.pagination.max_total_hits == 1000
227227
assert response.proximity_precision is ProximityPrecision.BY_WORD
228-
assert response.embedders is None
228+
assert response.embedders == {}
229229

230230

231231
def test_get_ranking_rules_default(empty_index, default_ranking_rules):

tests/test_search.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,30 @@ def test_vector_search(index_with_documents_and_vectors):
483483
assert len(response.hits) >= 1
484484

485485

486+
def test_vector_search_retrieve_vectors(index_with_documents_and_vectors):
487+
index = index_with_documents_and_vectors()
488+
response = index.search(
489+
"",
490+
vector=[0.1, 0.2],
491+
hybrid=Hybrid(semantic_ratio=1.0, embedder="default"),
492+
retrieve_vectors=True,
493+
)
494+
assert len(response.hits) >= 1
495+
assert response.hits[0].get("_vectors") is not None
496+
497+
498+
def test_vector_search_retrieve_vectors_false(index_with_documents_and_vectors):
499+
index = index_with_documents_and_vectors()
500+
response = index.search(
501+
"",
502+
vector=[0.1, 0.2],
503+
hybrid=Hybrid(semantic_ratio=1.0, embedder="default"),
504+
retrieve_vectors=False,
505+
)
506+
assert len(response.hits) >= 1
507+
assert response.hits[0].get("_vectors") is None
508+
509+
486510
def test_basic_facet_search(index_with_documents):
487511
index = index_with_documents()
488512
update = index.update_filterable_attributes(["genre"])

0 commit comments

Comments
 (0)