From 9c1d189d56f2cb00ba6722b430ca035d711df00b Mon Sep 17 00:00:00 2001 From: Shalabh Agarwal Date: Wed, 5 Jun 2024 20:15:19 +0530 Subject: [PATCH] Add proximityPrecision setting --- .code-samples.meilisearch.yaml | 6 ++ meilisearch/_httprequests.py | 19 +++++- meilisearch/config.py | 1 + meilisearch/index.py | 66 ++++++++++++++++++- meilisearch/models/index.py | 6 ++ ...ettings_proximity_precision_meilisearch.py | 37 +++++++++++ 6 files changed, 132 insertions(+), 3 deletions(-) create mode 100644 tests/settings/test_settings_proximity_precision_meilisearch.py diff --git a/.code-samples.meilisearch.yaml b/.code-samples.meilisearch.yaml index 069d80b2..7a60e0a7 100644 --- a/.code-samples.meilisearch.yaml +++ b/.code-samples.meilisearch.yaml @@ -714,3 +714,9 @@ update_search_cutoff_1: |- client.index('movies').update_search_cutoff_ms(150) reset_search_cutoff_1: |- client.index('movies').reset_search_cutoff_ms() +get_proximity_precision_settings_1: |- + client.index('books').get_proximity_precision() +update_proximity_precision_settings_1: |- + client.index('books').update_proximity_precision(ProximityPrecision.BY_ATTRIBUTE) +reset_proximity_precision_settings_1: |- + client.index('books').reset_proximity_precision() diff --git a/meilisearch/_httprequests.py b/meilisearch/_httprequests.py index 1af97ad3..466a5ed8 100644 --- a/meilisearch/_httprequests.py +++ b/meilisearch/_httprequests.py @@ -12,6 +12,7 @@ MeilisearchCommunicationError, MeilisearchTimeoutError, ) +from meilisearch.models.index import ProximityPrecision from meilisearch.version import qualified_version @@ -28,7 +29,14 @@ def send_request( http_method: Callable, path: str, body: Optional[ - Union[Mapping[str, Any], Sequence[Mapping[str, Any]], List[str], str, int] + Union[ + Mapping[str, Any], + Sequence[Mapping[str, Any]], + List[str], + str, + int, + ProximityPrecision, + ] ] = None, content_type: Optional[str] = None, ) -> Any: @@ -90,7 +98,14 @@ def put( self, path: str, body: Optional[ - Union[Mapping[str, Any], Sequence[Mapping[str, Any]], List[str], str, int] + Union[ + Mapping[str, Any], + Sequence[Mapping[str, Any]], + List[str], + str, + int, + ProximityPrecision, + ] ] = None, content_type: Optional[str] = "application/json", ) -> Any: diff --git a/meilisearch/config.py b/meilisearch/config.py index 3677f948..6d91bae3 100644 --- a/meilisearch/config.py +++ b/meilisearch/config.py @@ -40,6 +40,7 @@ class Paths: swap = "swap-indexes" embedders = "embedders" search_cutoff_ms = "search-cutoff-ms" + proximity_precision = "proximity-precision" def __init__( self, diff --git a/meilisearch/index.py b/meilisearch/index.py index d5e54343..23700174 100644 --- a/meilisearch/index.py +++ b/meilisearch/index.py @@ -5,6 +5,8 @@ from urllib import parse from warnings import warn +from camel_converter import to_snake + from meilisearch._httprequests import HttpRequests from meilisearch._utils import iso_to_date_time from meilisearch.config import Config @@ -17,6 +19,7 @@ IndexStats, OpenAiEmbedder, Pagination, + ProximityPrecision, TypoTolerance, UserProvidedEmbedder, ) @@ -24,7 +27,7 @@ from meilisearch.task import TaskHandler -# pylint: disable=too-many-public-methods +# pylint: disable=too-many-public-methods, too-many-lines class Index: """ Indexes routes wrapper. @@ -1917,6 +1920,67 @@ def reset_search_cutoff_ms(self) -> TaskInfo: return TaskInfo(**task) + # PROXIMITY PRECISION SETTINGS + + def get_proximity_precision(self) -> ProximityPrecision: + """Get the proximity_precision of the index. + + Returns + ------- + settings: + proximity_precision of the index. + + Raises + ------ + MeilisearchApiError + 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 + """ + response = self.http.get(self.__settings_url_for(self.config.paths.proximity_precision)) + return ProximityPrecision[to_snake(response).upper()] + + def update_proximity_precision(self, body: Union[ProximityPrecision, None]) -> TaskInfo: + """Update the proximity_precision of the index. + + Parameters + ---------- + body: + proximity_precision + + Returns + ------- + task_info: + TaskInfo instance containing information about a task to track the progress of an asynchronous process. + https://www.meilisearch.com/docs/reference/api/tasks#get-one-task + + Raises + ------ + MeilisearchApiError + 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 + """ + task = self.http.put(self.__settings_url_for(self.config.paths.proximity_precision), body) + + return TaskInfo(**task) + + def reset_proximity_precision(self) -> TaskInfo: + """Reset the proximity_precision of the index + + Returns + ------- + task_info: + TaskInfo instance containing information about a task to track the progress of an asynchronous process. + https://www.meilisearch.com/docs/reference/api/tasks#get-one-task + + Raises + ------ + MeilisearchApiError + 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 + """ + task = self.http.delete( + self.__settings_url_for(self.config.paths.proximity_precision), + ) + + return TaskInfo(**task) + @staticmethod def _batch( documents: Sequence[Mapping[str, Any]], batch_size: int diff --git a/meilisearch/models/index.py b/meilisearch/models/index.py index 479f67b7..ada1782b 100644 --- a/meilisearch/models/index.py +++ b/meilisearch/models/index.py @@ -1,5 +1,6 @@ from __future__ import annotations +from enum import Enum from typing import Any, Dict, Iterator, List, Optional, Union from camel_converter import to_snake @@ -48,6 +49,11 @@ class TypoTolerance(CamelBase): min_word_size_for_typos: Optional[MinWordSizeForTypos] = None +class ProximityPrecision(str, Enum): + BY_WORD = "byWord" + BY_ATTRIBUTE = "byAttribute" + + class OpenAiEmbedder(CamelBase): source: str = "openAi" model: Optional[str] = None # Defaults to text-embedding-ada-002 diff --git a/tests/settings/test_settings_proximity_precision_meilisearch.py b/tests/settings/test_settings_proximity_precision_meilisearch.py new file mode 100644 index 00000000..45e77e5d --- /dev/null +++ b/tests/settings/test_settings_proximity_precision_meilisearch.py @@ -0,0 +1,37 @@ +from meilisearch.models.index import ProximityPrecision + +NEW_PROXIMITY_PRECISION = ProximityPrecision.BY_ATTRIBUTE + + +def test_get_proximity_precision(empty_index): + """Tests getting default proximity precision.""" + response = empty_index().get_proximity_precision() + assert response == ProximityPrecision.BY_WORD + + +def test_update_proximity_precision(empty_index): + """Tests updating proximity precision.""" + index = empty_index() + response = index.update_proximity_precision(NEW_PROXIMITY_PRECISION) + update = index.wait_for_task(response.task_uid) + assert update.status == "succeeded" + response = index.get_proximity_precision() + assert NEW_PROXIMITY_PRECISION == response + + +def test_reset_proximity_precision(empty_index): + """Tests resetting the proximity precision to its default value.""" + index = empty_index() + # Update the settings first + response = index.update_proximity_precision(NEW_PROXIMITY_PRECISION) + update = index.wait_for_task(response.task_uid) + assert update.status == "succeeded" + # Check the settings have been correctly updated + response = index.get_proximity_precision() + assert NEW_PROXIMITY_PRECISION == response + # Check the reset of the settings + response = index.reset_proximity_precision() + update = index.wait_for_task(response.task_uid) + assert update.status == "succeeded" + response = index.get_proximity_precision() + assert response == ProximityPrecision.BY_WORD