@@ -139,9 +139,9 @@ def build_spatial_filter(geo_field, bbox, relation=None):
139
139
raise ValueError (f"Unsupported relation '{ relation } '. Must be one of { supported_relations } ." )
140
140
141
141
try :
142
- bbox = [float (val .strip ()) for val in bbox .split ("| " ) if val .strip ()]
142
+ bbox = [float (val .strip ()) for val in bbox .split (", " ) if val .strip ()]
143
143
except ValueError :
144
- raise ValueError ("Invalid bbox format. Ensure it is a '| ' separated string of numeric values." )
144
+ raise ValueError ("Invalid bbox format. Ensure it is a ', ' separated string of numeric values." )
145
145
146
146
if not bbox or len (bbox ) != 4 :
147
147
raise ValueError ("Invalid bbox. Expected four coordinates: \n "
@@ -171,6 +171,65 @@ def build_sort_filter(sort_field="relevancy", sort_order="desc"):
171
171
"""
172
172
Builds a dynamic sort parameter for OpenSearch based on a single field and order.
173
173
174
+ Args:
175
+ sort_field (str): The field to sort by (e.g., "relevancy", "date", "popularity", "title").
176
+ Defaults to "relevancy" (maps to '_score') if not provided.
177
+ sort_order (str): The sort order ("asc" for ascending, "desc" for descending).
178
+ Defaults to "desc". Forced to "desc" for relevancy.
179
+
180
+ Returns:
181
+ list: A valid sort parameter for OpenSearch.
182
+
183
+ Raises:
184
+ ValueError: If the provided sort_field is unsupported.
185
+ """
186
+
187
+ # Handle empty input strings by setting defaults
188
+ if not sort_field :
189
+ sort_field = "relevancy" # Default sort field
190
+ if not sort_order :
191
+ sort_order = "desc" # Default sort order
192
+
193
+ # Normalize input (case-insensitive)
194
+ sort_field = sort_field .lower ()
195
+ sort_order = sort_order .lower ()
196
+
197
+ # Supported sort fields
198
+ supported_sort_fields = ["_score" , "date" , "popularity" , "title" , "relevancy" ]
199
+
200
+ # Map user-friendly "relevancy" to OpenSearch's "_score"
201
+ if sort_field == "relevancy" :
202
+ sort_field = "_score"
203
+
204
+ # Validate the sort field
205
+ if sort_field not in supported_sort_fields :
206
+ raise ValueError (
207
+ f"Unsupported sort field '{ sort_field } '. Supported fields are: { supported_sort_fields } ."
208
+ )
209
+
210
+ # Enforce descending order for '_score' (relevance)
211
+ if sort_field == "_score" :
212
+ sort_order = "desc"
213
+
214
+ # Adjust for specific OpenSearch requirements
215
+ field_mapping = {
216
+ "title" : "title.keyword" , # Sort 'title' by its keyword version
217
+ "date" : "published" # Map 'date' to 'published'
218
+ }
219
+ sort_field = field_mapping .get (sort_field , sort_field )
220
+
221
+ # Ensure valid sort order
222
+ if sort_order not in ["asc" , "desc" ]:
223
+ raise ValueError ("Invalid sort order. Must be 'asc' or 'desc'." )
224
+
225
+ # Return the sort parameter
226
+ print (sort_field , " " , sort_order )
227
+ return [{sort_field : {"order" : sort_order }}]
228
+
229
+ def build_sort_filter2 (sort_field = "relevancy" , sort_order = "desc" ):
230
+ """
231
+ Builds a dynamic sort parameter for OpenSearch based on a single field and order.
232
+
174
233
Args:
175
234
sort_field (str): The field to sort by (e.g., "relevancy", "date", "popularity", "title").
176
235
Defaults to "relevancy" (_score) if not provided.
0 commit comments