From 45ff5da86e7a1147fca78e7b19e4b325649be897 Mon Sep 17 00:00:00 2001 From: chvostek Date: Thu, 1 Oct 2026 17:20:13 +0200 Subject: [PATCH 1/4] [NAE-2469] Fulltext search configuration - implement possibility to configure fulltext field per menu item view or per case search request --- .../service/ElasticCasePrioritySearch.java | 1 - .../elastic/service/ElasticCaseService.java | 6 ++- .../web/requestbodies/CaseSearchRequest.java | 5 +++ .../domain/configurations/CaseViewBody.java | 5 +++ .../configurations/CaseViewConstants.java | 1 + .../menu/case_view_configuration.xml | 45 +++++++++++++++++-- 6 files changed, 57 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/netgrif/application/engine/elastic/service/ElasticCasePrioritySearch.java b/src/main/java/com/netgrif/application/engine/elastic/service/ElasticCasePrioritySearch.java index 5bd6e66142e..2c1d1c18050 100644 --- a/src/main/java/com/netgrif/application/engine/elastic/service/ElasticCasePrioritySearch.java +++ b/src/main/java/com/netgrif/application/engine/elastic/service/ElasticCasePrioritySearch.java @@ -10,7 +10,6 @@ @Service public class ElasticCasePrioritySearch implements IElasticCasePrioritySearch { - @Autowired protected ElasticCaseSearchConfiguration elasticCaseSearchConfiguration; diff --git a/src/main/java/com/netgrif/application/engine/elastic/service/ElasticCaseService.java b/src/main/java/com/netgrif/application/engine/elastic/service/ElasticCaseService.java index b15a936daaa..b91fff2e186 100644 --- a/src/main/java/com/netgrif/application/engine/elastic/service/ElasticCaseService.java +++ b/src/main/java/com/netgrif/application/engine/elastic/service/ElasticCaseService.java @@ -396,7 +396,11 @@ protected void buildFullTextQuery(CaseSearchRequest request, BoolQueryBuilder qu // TODO: improvement? wildcard does not scale good //String searchText = elasticsearchProperties.isAnalyzerEnabled() ? request.fullText : "*" + request.fullText + "*"; String searchText = "*" + request.fullText + "*"; - QueryBuilder fullTextQuery = queryStringQuery(searchText).fields(iElasticCasePrioritySearch.fullTextFields()); + Map finalFullTextFieldsMap = new HashMap<>(iElasticCasePrioritySearch.fullTextFields()); + if (request.fullTextFields != null) { + request.fullTextFields.forEach(finalFullTextFieldsMap::putIfAbsent); + } + QueryBuilder fullTextQuery = queryStringQuery(searchText).fields(finalFullTextFieldsMap); query.must(fullTextQuery); } diff --git a/src/main/java/com/netgrif/application/engine/elastic/web/requestbodies/CaseSearchRequest.java b/src/main/java/com/netgrif/application/engine/elastic/web/requestbodies/CaseSearchRequest.java index 735604811b9..81c36ec3503 100644 --- a/src/main/java/com/netgrif/application/engine/elastic/web/requestbodies/CaseSearchRequest.java +++ b/src/main/java/com/netgrif/application/engine/elastic/web/requestbodies/CaseSearchRequest.java @@ -51,6 +51,8 @@ public class CaseSearchRequest implements Serializable { public Map tags; + public Map fullTextFields; + public CaseSearchRequest(Map request) { if (request.containsKey("process") && request.get("process") instanceof List) { List processIdentifiers = (List) request.get("process"); @@ -94,6 +96,9 @@ public CaseSearchRequest(Map request) { if (request.containsKey("group") && request.get("group") instanceof List) { this.group = (List) request.get("group"); } + if (request.containsKey("fullTextFields") && request.get("fullTextFields") instanceof Map) { + this.fullTextFields = (Map) request.get("fullTextFields"); + } } @Data diff --git a/src/main/java/com/netgrif/application/engine/menu/domain/configurations/CaseViewBody.java b/src/main/java/com/netgrif/application/engine/menu/domain/configurations/CaseViewBody.java index 7e796f6735c..03355b92148 100644 --- a/src/main/java/com/netgrif/application/engine/menu/domain/configurations/CaseViewBody.java +++ b/src/main/java/com/netgrif/application/engine/menu/domain/configurations/CaseViewBody.java @@ -22,6 +22,7 @@ public class CaseViewBody extends ViewBody { private boolean showCreateCaseButton = true; private String bannedNetsInCreation; private boolean showMoreMenu = false; + private List fullTextFields; private boolean allowHeaderTableMode = true; private List headersMode = new ArrayList<>(List.of("sort", "edit", "search")); private String headersDefaultMode = "sort"; @@ -78,6 +79,10 @@ protected ToDataSetOutcome toDataSetInternal(ToDataSetOutcome outcome) { this.bannedNetsInCreation); outcome.putDataSetEntry(CaseViewConstants.FIELD_SHOW_MORE_MENU, FieldType.BOOLEAN, this.showMoreMenu); + if (this.fullTextFields != null) { + outcome.putDataSetEntry(CaseViewConstants.FIELD_FULLTEXT_FIELDS, FieldType.STRING_COLLECTION, + this.fullTextFields); + } outcome.putDataSetEntry(CaseViewConstants.FIELD_ALLOW_HEADER_TABLE_MODE, FieldType.BOOLEAN, this.allowHeaderTableMode); outcome.putDataSetEntry(CaseViewConstants.FIELD_HEADERS_MODE, FieldType.MULTICHOICE_MAP, diff --git a/src/main/java/com/netgrif/application/engine/menu/domain/configurations/CaseViewConstants.java b/src/main/java/com/netgrif/application/engine/menu/domain/configurations/CaseViewConstants.java index 2cfdaabe45d..bbf5dc781e6 100644 --- a/src/main/java/com/netgrif/application/engine/menu/domain/configurations/CaseViewConstants.java +++ b/src/main/java/com/netgrif/application/engine/menu/domain/configurations/CaseViewConstants.java @@ -26,4 +26,5 @@ public class CaseViewConstants extends ViewConstants { public static final String FIELD_ALL_ALLOWED_NETS = "case_all_allowed_nets"; public static final String FIELD_ALLOWED_NETS = "case_allowed_nets"; public static final String FIELD_INHERIT_ALLOWED_NETS = "case_inherit_allowed_nets"; + public static final String FIELD_FULLTEXT_FIELDS = "case_fulltext_fields"; } diff --git a/src/main/resources/petriNets/engine-processes/menu/case_view_configuration.xml b/src/main/resources/petriNets/engine-processes/menu/case_view_configuration.xml index 2329ace50e1..47e1ce1473a 100644 --- a/src/main/resources/petriNets/engine-processes/menu/case_view_configuration.xml +++ b/src/main/resources/petriNets/engine-processes/menu/case_view_configuration.xml @@ -389,6 +389,11 @@ Inherit allowed nets? true + + case_fulltext_fields + Fulltext fields + Fields to consider in fulltext search + @@ -440,6 +445,8 @@ Aktívny stĺpec pre zoradenie Napríklad: meta-title Konfigurácia zobrazenia prípadov + todo 2469 + todo 2469 Schaltflächentitel "Neuer Fall" @@ -490,6 +497,8 @@ Aktive Spalte zum Sortieren Beispiel: meta-title Konfiguration der Fallansicht + todo 2469 + todo 2469 @@ -563,7 +572,7 @@ - case_show_more_menu + case_fulltext_fields editable @@ -577,7 +586,7 @@ - case_allow_export + case_show_more_menu editable @@ -587,7 +596,7 @@ 1 1 - standard + outline @@ -675,7 +684,7 @@ - advanced_content_form + case_allow_export editable @@ -683,6 +692,20 @@ 0 3 1 + 1 + + standard + + + + advanced_content_form + + editable + + + 0 + 4 + 1 3 outline @@ -1519,6 +1542,20 @@ outline + + case_fulltext_fields + + visible + + + 0 + 26 + 1 + 1 + + outline + + From ca5d95c1fc63ea55860434c30b4300a84f279c37 Mon Sep 17 00:00:00 2001 From: chvostek Date: Thu, 1 Oct 2026 19:10:20 +0200 Subject: [PATCH 2/4] [NAE-2469] Fulltext search configuration - add translations --- .../menu/case_view_configuration.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/resources/petriNets/engine-processes/menu/case_view_configuration.xml b/src/main/resources/petriNets/engine-processes/menu/case_view_configuration.xml index 47e1ce1473a..e1b28887e39 100644 --- a/src/main/resources/petriNets/engine-processes/menu/case_view_configuration.xml +++ b/src/main/resources/petriNets/engine-processes/menu/case_view_configuration.xml @@ -391,8 +391,8 @@ case_fulltext_fields - Fulltext fields - Fields to consider in fulltext search + Full-text fields + Fields to consider in a full-text search @@ -445,8 +445,8 @@ Aktívny stĺpec pre zoradenie Napríklad: meta-title Konfigurácia zobrazenia prípadov - todo 2469 - todo 2469 + Full-text polia + Polia, ktoré sa použijú pre full-text vyhľadávanie Schaltflächentitel "Neuer Fall" @@ -497,8 +497,8 @@ Aktive Spalte zum Sortieren Beispiel: meta-title Konfiguration der Fallansicht - todo 2469 - todo 2469 + Volltextfelder + Bei der Volltextsuche zu berücksichtigende Felder From 1bd9a47b47bfe98e3071af7326361e7ccd9aaf6c Mon Sep 17 00:00:00 2001 From: chvostek Date: Thu, 1 Oct 2026 20:32:02 +0200 Subject: [PATCH 3/4] [NAE-2469] Fulltext search configuration - fix CaseSearchRequest fullTextFields map conversion --- .../elastic/web/requestbodies/CaseSearchRequest.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/netgrif/application/engine/elastic/web/requestbodies/CaseSearchRequest.java b/src/main/java/com/netgrif/application/engine/elastic/web/requestbodies/CaseSearchRequest.java index 81c36ec3503..05fb511ba14 100644 --- a/src/main/java/com/netgrif/application/engine/elastic/web/requestbodies/CaseSearchRequest.java +++ b/src/main/java/com/netgrif/application/engine/elastic/web/requestbodies/CaseSearchRequest.java @@ -8,6 +8,7 @@ import lombok.NoArgsConstructor; import java.io.Serializable; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -97,7 +98,15 @@ public CaseSearchRequest(Map request) { this.group = (List) request.get("group"); } if (request.containsKey("fullTextFields") && request.get("fullTextFields") instanceof Map) { - this.fullTextFields = (Map) request.get("fullTextFields"); + Map fields = (Map) request.get("fullTextFields"); + Map convertedFields = new HashMap<>(); + for (Map.Entry field : fields.entrySet()) { + if (!(field.getKey() instanceof String) || !(field.getValue() instanceof Number)) { + throw new IllegalArgumentException("fullTextFields must map strings to numbers"); + } + convertedFields.put((String) field.getKey(), ((Number) field.getValue()).floatValue()); + } + this.fullTextFields = convertedFields; } } From c54e3a1c8b90cdde28bcca7c4370a399cff368f7 Mon Sep 17 00:00:00 2001 From: chvostek Date: Fri, 2 Oct 2026 09:35:49 +0200 Subject: [PATCH 4/4] [NAE-2469] Fulltext search configuration - update default full text configuration --- .../engine/configuration/ElasticCaseSearchConfiguration.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/netgrif/application/engine/configuration/ElasticCaseSearchConfiguration.java b/src/main/java/com/netgrif/application/engine/configuration/ElasticCaseSearchConfiguration.java index 01e7d1a271d..cc9d5722ab1 100644 --- a/src/main/java/com/netgrif/application/engine/configuration/ElasticCaseSearchConfiguration.java +++ b/src/main/java/com/netgrif/application/engine/configuration/ElasticCaseSearchConfiguration.java @@ -12,10 +12,10 @@ public class ElasticCaseSearchConfiguration { private Map fullTextFieldMap = Map.of( - "title.keyword", 2f, + "title", 2f, "authorName", 1f, "authorEmail", 1f, - "visualId.keyword", 2f + "visualId", 2f ); }