@@ -44,6 +44,63 @@ async def get_stats(self) -> Dict[str, Any]:
4444 """Get database stats"""
4545 return self .client .get_all_stats ()
4646
47+ async def search (
48+ self ,
49+ query : str ,
50+ index_uid : Optional [str ] = None ,
51+ limit : Optional [int ] = 20 ,
52+ offset : Optional [int ] = 0 ,
53+ filter : Optional [str ] = None ,
54+ sort : Optional [List [str ]] = None ,
55+ ** kwargs
56+ ) -> Dict [str , Any ]:
57+ """
58+ Search through Meilisearch indices.
59+ If index_uid is provided, search in that specific index.
60+ If not provided, search across all available indices.
61+ """
62+ try :
63+ # Prepare search parameters, removing None values
64+ search_params = {
65+ "limit" : limit if limit is not None else 20 ,
66+ "offset" : offset if offset is not None else 0 ,
67+ }
68+
69+ if filter is not None :
70+ search_params ["filter" ] = filter
71+ if sort is not None :
72+ search_params ["sort" ] = sort
73+
74+ # Add any additional parameters
75+ search_params .update ({k : v for k , v in kwargs .items () if v is not None })
76+
77+ if index_uid :
78+ # Search in specific index
79+ index = self .client .index (index_uid )
80+ return index .search (query , search_params )
81+ else :
82+ # Search across all indices
83+ results = {}
84+ indexes = self .client .get_indexes ()
85+
86+ for index in indexes ["results" ]:
87+ try :
88+ search_result = index .search (query , search_params )
89+ if search_result ["hits" ]: # Only include indices with matches
90+ results [index .uid ] = search_result
91+ except Exception as e :
92+ logger .warning (f"Failed to search index { index .uid } : { str (e )} " )
93+ continue
94+
95+ return {
96+ "multi_index" : True ,
97+ "query" : query ,
98+ "results" : results
99+ }
100+
101+ except Exception as e :
102+ raise Exception (f"Search failed: { str (e )} " )
103+
47104 async def get_indexes (self ) -> Dict [str , Any ]:
48105 """Get all indexes"""
49106 indexes = self .client .get_indexes ()
0 commit comments