Skip to content

Commit 5a404ec

Browse files
authored
Merge pull request #1094 from sanders41/meilisearch-1.11.0
Update for Meilisearch v1.11.0
2 parents 26f32bc + 72bbfd8 commit 5a404ec

File tree

8 files changed

+160
-18
lines changed

8 files changed

+160
-18
lines changed

docker-compose.https.yml

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
services:
22
meilisearch:
3-
image: getmeili/meilisearch:latest
3+
# image: getmeili/meilisearch:latest
4+
image: getmeili/meilisearch:v1
45
ports:
56
- "7700:7700"
67
environment:
@@ -9,4 +10,11 @@ services:
910
volumes:
1011
- ./meilisearch.key:/meilisearch.key
1112
- ./meilisearch.crt:/meilisearch.crt
12-
command: ["meilisearch", "--ssl-cert-path", "/meilisearch.crt", "--ssl-key-path", "/meilisearch.key"]
13+
command:
14+
[
15+
"meilisearch",
16+
"--ssl-cert-path",
17+
"/meilisearch.crt",
18+
"--ssl-key-path",
19+
"/meilisearch.key",
20+
]

docker-compose.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
services:
22
meilisearch:
3-
image: getmeili/meilisearch:latest
3+
# image: getmeili/meilisearch:latest
4+
image: getmeili/meilisearch:v1
45
ports:
56
- "7700:7700"
67
environment:

meilisearch_python_sdk/_client.py

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
from meilisearch_python_sdk.models.index import IndexInfo
2525
from meilisearch_python_sdk.models.search import (
2626
Federation,
27+
FederationMerged,
2728
SearchParams,
2829
SearchResultsFederated,
2930
SearchResultsWithUID,
@@ -587,7 +588,7 @@ async def multi_search(
587588
self,
588589
queries: list[SearchParams],
589590
*,
590-
federation: Federation | None = None,
591+
federation: Federation | FederationMerged | None = None,
591592
hits_type: Any = JsonDict,
592593
) -> list[SearchResultsWithUID] | SearchResultsFederated:
593594
"""Multi-index search.
@@ -628,10 +629,18 @@ async def multi_search(
628629
else:
629630
processed_queries = [x.model_dump(by_alias=True) for x in queries]
630631

632+
if federation:
633+
federation_payload = federation.model_dump(by_alias=True)
634+
if federation.facets_by_index is None:
635+
del federation_payload["facetsByIndex"]
636+
637+
else:
638+
federation_payload = None
639+
631640
response = await self._http_requests.post(
632641
url,
633642
body={
634-
"federation": federation.model_dump(by_alias=True) if federation else None,
643+
"federation": federation_payload,
635644
"queries": processed_queries,
636645
},
637646
)
@@ -1396,7 +1405,7 @@ def multi_search(
13961405
self,
13971406
queries: list[SearchParams],
13981407
*,
1399-
federation: Federation | None = None,
1408+
federation: Federation | FederationMerged | None = None,
14001409
hits_type: Any = JsonDict,
14011410
) -> list[SearchResultsWithUID] | SearchResultsFederated:
14021411
"""Multi-index search.
@@ -1437,10 +1446,18 @@ def multi_search(
14371446
else:
14381447
processed_queries = [x.model_dump(by_alias=True) for x in queries]
14391448

1449+
if federation:
1450+
federation_payload = federation.model_dump(by_alias=True)
1451+
if federation.facets_by_index is None:
1452+
del federation_payload["facetsByIndex"]
1453+
1454+
else:
1455+
federation_payload = None
1456+
14401457
response = self._http_requests.post(
14411458
url,
14421459
body={
1443-
"federation": federation.model_dump(by_alias=True) if federation else None,
1460+
"federation": federation_payload,
14441461
"queries": processed_queries,
14451462
},
14461463
)

meilisearch_python_sdk/index.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3079,7 +3079,11 @@ async def update_settings(
30793079
>>> index = client.index("movies")
30803080
>>> await index.update_settings(new_settings)
30813081
"""
3082-
body_dict = {k: v for k, v in body.model_dump(by_alias=True).items() if v is not None}
3082+
body_dict = {
3083+
k: v
3084+
for k, v in body.model_dump(by_alias=True, exclude_none=True).items()
3085+
if v is not None
3086+
}
30833087
response = await self._http_requests.patch(self._settings_url, body_dict, compress=compress)
30843088

30853089
return TaskInfo(**response.json())
@@ -4270,7 +4274,9 @@ async def update_embedders(self, embedders: Embedders, *, compress: bool = False
42704274
payload = {}
42714275
for key, embedder in embedders.embedders.items():
42724276
payload[key] = {
4273-
k: v for k, v in embedder.model_dump(by_alias=True).items() if v is not None
4277+
k: v
4278+
for k, v in embedder.model_dump(by_alias=True, exclude_none=True).items()
4279+
if v is not None
42744280
}
42754281

42764282
response = await self._http_requests.patch(
@@ -6498,7 +6504,11 @@ def update_settings(self, body: MeilisearchSettings, *, compress: bool = False)
64986504
>>> index = client.index("movies")
64996505
>>> index.update_settings(new_settings)
65006506
"""
6501-
body_dict = {k: v for k, v in body.model_dump(by_alias=True).items() if v is not None}
6507+
body_dict = {
6508+
k: v
6509+
for k, v in body.model_dump(by_alias=True, exclude_none=True).items()
6510+
if v is not None
6511+
}
65026512
response = self._http_requests.patch(self._settings_url, body_dict, compress=compress)
65036513

65046514
return TaskInfo(**response.json())
@@ -7672,7 +7682,9 @@ def update_embedders(self, embedders: Embedders, *, compress: bool = False) -> T
76727682
payload = {}
76737683
for key, embedder in embedders.embedders.items():
76747684
payload[key] = {
7675-
k: v for k, v in embedder.model_dump(by_alias=True).items() if v is not None
7685+
k: v
7686+
for k, v in embedder.model_dump(by_alias=True, exclude_none=True).items()
7687+
if v is not None
76767688
}
76777689

76787690
response = self._http_requests.patch(

meilisearch_python_sdk/models/search.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,24 @@ class FacetSearchResults(CamelBase):
2424

2525
class Hybrid(CamelBase):
2626
semantic_ratio: float
27-
embedder: str | None = None
27+
embedder: str
28+
29+
30+
class MergeFacets(CamelBase):
31+
max_values_per_facet: int
2832

2933

3034
class Federation(CamelBase):
3135
limit: int = 20
3236
offset: int = 0
37+
facets_by_index: dict[str, list[str]] | None = None
38+
39+
40+
class FederationMerged(CamelBase):
41+
limit: int = 20
42+
offset: int = 0
43+
facets_by_index: dict[str, list[str]] | None = None
44+
merge_facets: MergeFacets | None
3345

3446

3547
class SearchParams(CamelBase):
@@ -99,6 +111,7 @@ class SearchResultsFederated(CamelBase, Generic[T]):
99111
page: int | None = None
100112
hits_per_page: int | None = None
101113
semantic_hit_count: int | None = None
114+
facets_by_index: JsonDict | None = None
102115

103116

104117
class SimilarSearchResults(CamelBase, Generic[T]):

meilisearch_python_sdk/models/settings.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,18 +49,20 @@ class Distribution(CamelBase):
4949
class OpenAiEmbedder(CamelBase):
5050
source: str = "openAi"
5151
url: str | None = None
52-
model: str | None = None # Defaults to text-embedding-ada-002
53-
dimensions: int | None = None # Uses the model default
54-
api_key: str | None = None # Can be provided through a CLI option or environment variable
52+
model: str | None = None
53+
dimensions: int | None = None
54+
api_key: str | None = None
5555
document_template: str | None = None
56+
document_template_max_bytes: int | None = None
5657
distribution: Distribution | None = None
5758

5859

5960
class HuggingFaceEmbedder(CamelBase):
6061
source: str = "huggingFace"
61-
model: str | None = None # Defaults to BAAI/bge-base-en-v1.5
62+
model: str | None = None
6263
revision: str | None = None
6364
document_template: str | None = None
65+
document_template_max_bytes: int | None = None
6466
distribution: Distribution | None = None
6567

6668

@@ -71,6 +73,7 @@ class OllamaEmbedder(CamelBase):
7173
model: str
7274
dimensions: int | None = None
7375
document_template: str | None = None
76+
document_template_max_bytes: int | None = None
7477
distribution: Distribution | None = None
7578

7679

@@ -80,6 +83,7 @@ class RestEmbedder(CamelBase):
8083
api_key: str | None = None
8184
dimensions: int
8285
document_template: str | None = None
86+
document_template_max_bytes: int | None = None
8387
distribution: Distribution | None = None
8488
headers: JsonDict | None = None
8589
request: JsonDict

tests/test_async_search.py

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,13 @@
99
from meilisearch_python_sdk import AsyncClient
1010
from meilisearch_python_sdk._task import async_wait_for_task
1111
from meilisearch_python_sdk.errors import MeilisearchApiError, MeilisearchError
12-
from meilisearch_python_sdk.models.search import Federation, Hybrid, SearchParams
12+
from meilisearch_python_sdk.models.search import (
13+
Federation,
14+
FederationMerged,
15+
Hybrid,
16+
MergeFacets,
17+
SearchParams,
18+
)
1319

1420

1521
async def test_basic_search(async_index_with_documents):
@@ -395,6 +401,55 @@ async def test_multi_search_federated(async_client, async_index_with_documents,
395401
assert "_federation" in response.hits[0]
396402

397403

404+
async def test_multi_search_federated_facets_by_index(
405+
async_client, async_index_with_documents, async_empty_index
406+
):
407+
index1 = await async_index_with_documents()
408+
task = await index1.update_filterable_attributes(["title"])
409+
await async_client.wait_for_task(task.task_uid)
410+
index2 = await async_empty_index()
411+
federation = Federation()
412+
federation.facets_by_index = {index1.uid: ["title"]}
413+
response = await async_client.multi_search(
414+
[
415+
SearchParams(index_uid=index1.uid, query="How to Train Your Dragon"),
416+
SearchParams(index_uid=index2.uid, query=""),
417+
],
418+
federation=federation,
419+
)
420+
421+
assert response.hits[0]["id"] == "166428"
422+
assert "_formatted" not in response.hits[0]
423+
assert "_federation" in response.hits[0]
424+
assert response.facets_by_index is not None
425+
426+
427+
async def test_multi_search_federated_merge_facets(
428+
async_client,
429+
async_index_with_documents,
430+
async_empty_index,
431+
):
432+
index1 = await async_index_with_documents()
433+
task = await index1.update_filterable_attributes(["title"])
434+
await async_client.wait_for_task(task.task_uid)
435+
index2 = await async_empty_index()
436+
federation = FederationMerged(merge_facets=MergeFacets(max_values_per_facet=10))
437+
federation.facets_by_index = {index1.uid: ["title"]}
438+
response = await async_client.multi_search(
439+
[
440+
SearchParams(index_uid=index1.uid, query="How to Train Your Dragon"),
441+
SearchParams(index_uid=index2.uid, query=""),
442+
],
443+
federation=federation,
444+
)
445+
446+
assert response.hits[0]["id"] == "166428"
447+
assert "_formatted" not in response.hits[0]
448+
assert "_federation" in response.hits[0]
449+
assert response.facets_by_index is None
450+
assert response.facet_distribution is not None
451+
452+
398453
async def test_multi_search_locales(async_client, async_index_with_documents, async_empty_index):
399454
index1 = await async_index_with_documents()
400455
index2 = await async_empty_index()

tests/test_search.py

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,13 @@
99
from meilisearch_python_sdk import Client
1010
from meilisearch_python_sdk._task import wait_for_task
1111
from meilisearch_python_sdk.errors import MeilisearchApiError, MeilisearchError
12-
from meilisearch_python_sdk.models.search import Federation, Hybrid, SearchParams
12+
from meilisearch_python_sdk.models.search import (
13+
Federation,
14+
FederationMerged,
15+
Hybrid,
16+
MergeFacets,
17+
SearchParams,
18+
)
1319

1420

1521
def test_basic_search(index_with_documents):
@@ -395,6 +401,32 @@ def test_multi_search_federated(client, index_with_documents, empty_index):
395401
assert "_federation" in response.hits[0]
396402

397403

404+
def test_multi_search_federated_merge_facets(
405+
client,
406+
index_with_documents,
407+
empty_index,
408+
):
409+
index1 = index_with_documents()
410+
task = index1.update_filterable_attributes(["title"])
411+
client.wait_for_task(task.task_uid)
412+
index2 = empty_index()
413+
federation = FederationMerged(merge_facets=MergeFacets(max_values_per_facet=10))
414+
federation.facets_by_index = {index1.uid: ["title"]}
415+
response = client.multi_search(
416+
[
417+
SearchParams(index_uid=index1.uid, query="How to Train Your Dragon"),
418+
SearchParams(index_uid=index2.uid, query=""),
419+
],
420+
federation=federation,
421+
)
422+
423+
assert response.hits[0]["id"] == "166428"
424+
assert "_formatted" not in response.hits[0]
425+
assert "_federation" in response.hits[0]
426+
assert response.facets_by_index is None
427+
assert response.facet_distribution is not None
428+
429+
398430
def test_multi_search_locales(client, index_with_documents, empty_index):
399431
index1 = index_with_documents()
400432
index2 = empty_index()

0 commit comments

Comments
 (0)