From 6fea5f2c5b1e6aa44502665be31a00450ff005a6 Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Tue, 24 Mar 2026 17:56:18 +0100 Subject: [PATCH] fix: use .keyword suffix for text field sorting in OpenSearch OpenSearch dynamically maps string fields as text with a .keyword subfield. Sorting on text fields throws an error; only .keyword, date, and numeric fields support sorting. Add .keyword suffix to all string sort columns (status, routeId, agentId, executionId, correlationId, applicationName) while keeping start_time and duration_ms as-is. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../server/core/search/SearchRequest.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/cameleer3-server-core/src/main/java/com/cameleer3/server/core/search/SearchRequest.java b/cameleer3-server-core/src/main/java/com/cameleer3/server/core/search/SearchRequest.java index ec1a80fb..f2c73a6b 100644 --- a/cameleer3-server-core/src/main/java/com/cameleer3/server/core/search/SearchRequest.java +++ b/cameleer3-server-core/src/main/java/com/cameleer3/server/core/search/SearchRequest.java @@ -59,16 +59,17 @@ public record SearchRequest( "durationMs", "executionId", "applicationName" ); - /** Maps camelCase API sort field names to snake_case OpenSearch/DB column names. */ + /** Maps camelCase API sort field names to OpenSearch field names. + * Text fields use .keyword subfield; date/numeric fields are used directly. */ private static final java.util.Map SORT_FIELD_TO_COLUMN = java.util.Map.ofEntries( java.util.Map.entry("startTime", "start_time"), - java.util.Map.entry("status", "status"), - java.util.Map.entry("agentId", "agent_id"), - java.util.Map.entry("routeId", "route_id"), - java.util.Map.entry("correlationId", "correlation_id"), java.util.Map.entry("durationMs", "duration_ms"), - java.util.Map.entry("executionId", "execution_id"), - java.util.Map.entry("applicationName", "application_name") + java.util.Map.entry("status", "status.keyword"), + java.util.Map.entry("agentId", "agent_id.keyword"), + java.util.Map.entry("routeId", "route_id.keyword"), + java.util.Map.entry("correlationId", "correlation_id.keyword"), + java.util.Map.entry("executionId", "execution_id.keyword"), + java.util.Map.entry("applicationName", "application_name.keyword") ); public SearchRequest {