24
24
from meilisearch .config import Config
25
25
from meilisearch .errors import version_error_hint_message
26
26
from meilisearch .models .document import Document , DocumentsResults
27
- from meilisearch .models .index import (
28
- CompositeEmbedder ,
27
+ from meilisearch .models .embedders import (
29
28
Embedders ,
30
- Faceting ,
29
+ EmbedderType ,
31
30
HuggingFaceEmbedder ,
32
- IndexStats ,
33
- LocalizedAttributes ,
34
31
OllamaEmbedder ,
35
32
OpenAiEmbedder ,
33
+ RestEmbedder ,
34
+ UserProvidedEmbedder ,
35
+ CompositeEmbedder ,
36
+ )
37
+ from meilisearch .models .index import (
38
+ Faceting ,
39
+ IndexStats ,
40
+ LocalizedAttributes ,
36
41
Pagination ,
37
42
ProximityPrecision ,
38
- RestEmbedder ,
39
43
TypoTolerance ,
40
- UserProvidedEmbedder ,
41
44
)
42
45
from meilisearch .models .task import Task , TaskInfo , TaskResults
43
46
from meilisearch .task import TaskHandler
@@ -278,14 +281,21 @@ def get_stats(self) -> IndexStats:
278
281
def search (self , query : str , opt_params : Optional [Mapping [str , Any ]] = None ) -> Dict [str , Any ]:
279
282
"""Search in the index.
280
283
284
+ https://www.meilisearch.com/docs/reference/api/search
285
+
281
286
Parameters
282
287
----------
283
288
query:
284
289
String containing the searched word(s)
285
290
opt_params (optional):
286
291
Dictionary containing optional query parameters.
287
- Note: The vector parameter is only available in Meilisearch >= v1.13.0
288
- https://www.meilisearch.com/docs/reference/api/search#search-in-an-index
292
+ Common parameters include:
293
+ - hybrid: Dict with 'semanticRatio' and 'embedder' fields for hybrid search
294
+ - vector: Array of numbers for vector search
295
+ - retrieveVectors: Boolean to include vector data in search results
296
+ - filter: Filter queries by an attribute's value
297
+ - limit: Maximum number of documents returned
298
+ - offset: Number of documents to skip
289
299
290
300
Returns
291
301
-------
@@ -299,7 +309,9 @@ def search(self, query: str, opt_params: Optional[Mapping[str, Any]] = None) ->
299
309
"""
300
310
if opt_params is None :
301
311
opt_params = {}
312
+
302
313
body = {"q" : query , ** opt_params }
314
+
303
315
return self .http .post (
304
316
f"{ self .config .paths .index } /{ self .uid } /{ self .config .paths .search } " ,
305
317
body = body ,
@@ -956,15 +968,7 @@ def get_settings(self) -> Dict[str, Any]:
956
968
)
957
969
958
970
if settings .get ("embedders" ):
959
- embedders : dict [
960
- str ,
961
- OpenAiEmbedder
962
- | HuggingFaceEmbedder
963
- | OllamaEmbedder
964
- | RestEmbedder
965
- | CompositeEmbedder
966
- | UserProvidedEmbedder ,
967
- ] = {}
971
+ embedders : dict [str , EmbedderType ] = {}
968
972
for k , v in settings ["embedders" ].items ():
969
973
if v .get ("source" ) == "openAi" :
970
974
embedders [k ] = OpenAiEmbedder (** v )
@@ -992,6 +996,26 @@ def update_settings(self, body: MutableMapping[str, Any]) -> TaskInfo:
992
996
----------
993
997
body:
994
998
Dictionary containing the settings of the index.
999
+ Supported settings include:
1000
+ - 'rankingRules': List of ranking rules
1001
+ - 'distinctAttribute': Attribute for deduplication
1002
+ - 'searchableAttributes': Attributes that can be searched
1003
+ - 'displayedAttributes': Attributes to display in search results
1004
+ - 'stopWords': Words ignored in search queries
1005
+ - 'synonyms': Dictionary of synonyms
1006
+ - 'filterableAttributes': Attributes that can be used for filtering
1007
+ - 'sortableAttributes': Attributes that can be used for sorting
1008
+ - 'typoTolerance': Settings for typo tolerance
1009
+ - 'pagination': Settings for pagination
1010
+ - 'faceting': Settings for faceting
1011
+ - 'dictionary': List of custom dictionary words
1012
+ - 'separatorTokens': List of separator tokens
1013
+ - 'nonSeparatorTokens': List of non-separator tokens
1014
+ - 'embedders': Dictionary of embedder configurations for AI-powered search
1015
+ - 'searchCutoffMs': Maximum search time in milliseconds
1016
+ - 'proximityPrecision': Precision for proximity ranking
1017
+ - 'localizedAttributes': Settings for localized attributes
1018
+
995
1019
More information:
996
1020
https://www.meilisearch.com/docs/reference/api/settings#update-settings
997
1021
@@ -1004,7 +1028,8 @@ def update_settings(self, body: MutableMapping[str, Any]) -> TaskInfo:
1004
1028
Raises
1005
1029
------
1006
1030
MeilisearchApiError
1007
- An error containing details about why Meilisearch can't process your request. Meilisearch error codes are described here: https://www.meilisearch.com/docs/reference/errors/error_codes#meilisearch-errors
1031
+ An error containing details about why Meilisearch can't process your request.
1032
+ Meilisearch error codes are described here: https://www.meilisearch.com/docs/reference/errors/error_codes#meilisearch-errors
1008
1033
"""
1009
1034
if body .get ("embedders" ):
1010
1035
for _ , v in body ["embedders" ].items ():
@@ -1883,10 +1908,13 @@ def reset_non_separator_tokens(self) -> TaskInfo:
1883
1908
def get_embedders (self ) -> Embedders | None :
1884
1909
"""Get embedders of the index.
1885
1910
1911
+ Retrieves the current embedder configuration from Meilisearch.
1912
+
1886
1913
Returns
1887
1914
-------
1888
- settings:
1889
- The embedders settings of the index.
1915
+ Embedders:
1916
+ The embedders settings of the index, or None if no embedders are configured.
1917
+ Contains a dictionary of embedder configurations, where keys are embedder names.
1890
1918
1891
1919
Raises
1892
1920
------
@@ -1898,38 +1926,37 @@ def get_embedders(self) -> Embedders | None:
1898
1926
if not response :
1899
1927
return None
1900
1928
1901
- embedders : dict [
1902
- str ,
1903
- OpenAiEmbedder
1904
- | HuggingFaceEmbedder
1905
- | OllamaEmbedder
1906
- | RestEmbedder
1907
- | CompositeEmbedder
1908
- | UserProvidedEmbedder ,
1909
- ] = {}
1929
+ embedders : dict [str , EmbedderType ] = {}
1910
1930
for k , v in response .items ():
1911
- if v .get ("source" ) == "openAi" :
1931
+ source = v .get ("source" )
1932
+ if source == "openAi" :
1912
1933
embedders [k ] = OpenAiEmbedder (** v )
1913
- elif v .get ("source" ) == "ollama" :
1914
- embedders [k ] = OllamaEmbedder (** v )
1915
- elif v .get ("source" ) == "huggingFace" :
1934
+ elif source == "huggingFace" :
1916
1935
embedders [k ] = HuggingFaceEmbedder (** v )
1917
- elif v .get ("source" ) == "rest" :
1936
+ elif source == "ollama" :
1937
+ embedders [k ] = OllamaEmbedder (** v )
1938
+ elif source == "rest" :
1918
1939
embedders [k ] = RestEmbedder (** v )
1919
- elif v . get ( " source" ) == "composite" :
1940
+ elif source == "composite" :
1920
1941
embedders [k ] = CompositeEmbedder (** v )
1942
+ elif source == "userProvided" :
1943
+ embedders [k ] = UserProvidedEmbedder (** v )
1921
1944
else :
1945
+ # Default to UserProvidedEmbedder for unknown sources
1922
1946
embedders [k ] = UserProvidedEmbedder (** v )
1923
1947
1924
1948
return Embedders (embedders = embedders )
1925
1949
1926
1950
def update_embedders (self , body : Union [MutableMapping [str , Any ], None ]) -> TaskInfo :
1927
1951
"""Update embedders of the index.
1928
1952
1953
+ Updates the embedder configuration for the index. The embedder configuration
1954
+ determines how Meilisearch generates vector embeddings for documents.
1955
+
1929
1956
Parameters
1930
1957
----------
1931
1958
body: dict
1932
- Dictionary containing the embedders.
1959
+ Dictionary containing the embedders configuration .
1933
1960
1934
1961
Returns
1935
1962
-------
@@ -1940,13 +1967,30 @@ def update_embedders(self, body: Union[MutableMapping[str, Any], None]) -> TaskI
1940
1967
Raises
1941
1968
------
1942
1969
MeilisearchApiError
1943
- An error containing details about why Meilisearch can't process your request. Meilisearch error codes are described here: https://www.meilisearch.com/docs/reference/errors/error_codes#meilisearch-errors
1970
+ An error containing details about why Meilisearch can't process your request.
1971
+ Meilisearch error codes are described here: https://www.meilisearch.com/docs/reference/errors/error_codes#meilisearch-errors
1944
1972
"""
1973
+ if body is not None and body .get ("embedders" ):
1974
+ embedders : dict [str , EmbedderType ] = {}
1975
+ for k , v in body ["embedders" ].items ():
1976
+ source = v .get ("source" )
1977
+ if source == "openAi" :
1978
+ embedders [k ] = OpenAiEmbedder (** v )
1979
+ elif source == "huggingFace" :
1980
+ embedders [k ] = HuggingFaceEmbedder (** v )
1981
+ elif source == "ollama" :
1982
+ embedders [k ] = OllamaEmbedder (** v )
1983
+ elif source == "rest" :
1984
+ embedders [k ] = RestEmbedder (** v )
1985
+ elif source == "composite" :
1986
+ embedders [k ] = CompositeEmbedder (** v )
1987
+ elif source == "userProvided" :
1988
+ embedders [k ] = UserProvidedEmbedder (** v )
1989
+ else :
1990
+ # Default to UserProvidedEmbedder for unknown sources
1991
+ embedders [k ] = UserProvidedEmbedder (** v )
1945
1992
1946
- if body :
1947
- for _ , v in body .items ():
1948
- if "documentTemplateMaxBytes" in v and v ["documentTemplateMaxBytes" ] is None :
1949
- del v ["documentTemplateMaxBytes" ]
1993
+ body = {"embedders" : {k : v .model_dump (by_alias = True ) for k , v in embedders .items ()}}
1950
1994
1951
1995
task = self .http .patch (self .__settings_url_for (self .config .paths .embedders ), body )
1952
1996
@@ -1955,6 +1999,8 @@ def update_embedders(self, body: Union[MutableMapping[str, Any], None]) -> TaskI
1955
1999
def reset_embedders (self ) -> TaskInfo :
1956
2000
"""Reset embedders of the index to default values.
1957
2001
2002
+ Removes all embedder configurations from the index.
2003
+
1958
2004
Returns
1959
2005
-------
1960
2006
task_info:
0 commit comments