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