Skip to content

Commit ec35e5d

Browse files
committed
Add multiple searches
Co-authored-by: Bruno Casali <[email protected]> Update meilisearch/client.py Co-authored-by: Bruno Casali <[email protected]> Fix error names
1 parent c3b668c commit ec35e5d

File tree

3 files changed

+61
-0
lines changed

3 files changed

+61
-0
lines changed

meilisearch/client.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# pylint: disable=too-many-public-methods
2+
13
from __future__ import annotations
24

35
import base64
@@ -205,6 +207,30 @@ def index(self, uid: str) -> Index:
205207
return Index(self.config, uid=uid)
206208
raise ValueError("The index UID should not be None")
207209

210+
def multi_search(self, queries: List[Dict[str, Any]]) -> Dict[str, List[Dict[str, Any]]]:
211+
"""Multi-index search.
212+
213+
Parameters
214+
----------
215+
queries:
216+
List of dictionaries containing the specified indexes and their search queries
217+
https://docs.meilisearch.com/reference/api/search.html#search-in-an-index
218+
219+
Returns
220+
-------
221+
results:
222+
Dictionary of results for each index
223+
224+
Raises
225+
------
226+
MeilisearchApiError
227+
An error containing details about why Meilisearch can't process your request. Meilisearch error codes are described here: https://docs.meilisearch.com/errors/#meilisearch-errors
228+
"""
229+
return self.http.post(
230+
f"{self.config.paths.multi_search}",
231+
body={"queries": queries},
232+
)
233+
208234
def get_all_stats(self) -> Dict[str, Any]:
209235
"""Get all stats of Meilisearch
210236

meilisearch/config.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ class Paths:
1616
task = "tasks"
1717
stat = "stats"
1818
search = "search"
19+
multi_search = "multi-search"
1920
document = "documents"
2021
setting = "settings"
2122
ranking_rules = "ranking-rules"
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import pytest
2+
3+
from meilisearch.errors import MeilisearchApiError
4+
5+
6+
def test_basic_multi_search(client, empty_index):
7+
"""Tests multi-search on two indexes."""
8+
empty_index("indexA")
9+
empty_index("indexB")
10+
response = client.multi_search(
11+
[{"indexUid": "indexA", "q": ""}, {"indexUid": "indexB", "q": ""}]
12+
)
13+
14+
assert isinstance(response, dict)
15+
assert response["results"][0]["indexUid"] == "indexA"
16+
assert response["results"][1]["indexUid"] == "indexB"
17+
assert response["results"][0]["limit"] == 20
18+
assert response["results"][1]["limit"] == 20
19+
20+
21+
def test_multi_search_one_index(client, empty_index):
22+
"""Tests multi-search on a simple query."""
23+
empty_index("indexA")
24+
response = client.multi_search([{"indexUid": "indexA", "q": ""}])
25+
26+
assert isinstance(response, dict)
27+
assert response["results"][0]["indexUid"] == "indexA"
28+
assert response["results"][0]["limit"] == 20
29+
30+
31+
def test_multi_search_on_no_index(client):
32+
"""Tests multi-search on a non existing index."""
33+
with pytest.raises(MeilisearchApiError):
34+
client.multi_search([{"indexUid": "indexDoesNotExist", "q": ""}])

0 commit comments

Comments
 (0)