Fixing Elasticsearch and OpenSearch ILIKE / IEQ for values with underscore
diff --git a/ext/elasticsearch/persistence/src/main/java/org/apache/syncope/core/persistence/elasticsearch/dao/ElasticsearchAnySearchDAO.java b/ext/elasticsearch/persistence/src/main/java/org/apache/syncope/core/persistence/elasticsearch/dao/ElasticsearchAnySearchDAO.java
index 5707c71..afbbae9 100644
--- a/ext/elasticsearch/persistence/src/main/java/org/apache/syncope/core/persistence/elasticsearch/dao/ElasticsearchAnySearchDAO.java
+++ b/ext/elasticsearch/persistence/src/main/java/org/apache/syncope/core/persistence/elasticsearch/dao/ElasticsearchAnySearchDAO.java
@@ -531,7 +531,7 @@
 
             case ILIKE:
                 StringBuilder output = new StringBuilder();
-                for (char c : cond.getExpression().toLowerCase().toCharArray()) {
+                for (char c : cond.getExpression().toLowerCase().replace("\\_", "_").toCharArray()) {
                     if (c == '%') {
                         output.append(".*");
                     } else if (Character.isLetter(c)) {
@@ -549,7 +549,8 @@
 
             case LIKE:
                 query = new Query.Builder().wildcard(QueryBuilders.wildcard().
-                        field(schema.getKey()).value(cond.getExpression().replace('%', '*')).build()).build();
+                        field(schema.getKey()).value(cond.getExpression().replace('%', '*').replace("\\_", "_")).
+                        build()).build();
                 break;
 
             case IEQ:
diff --git a/ext/opensearch/persistence/src/main/java/org/apache/syncope/core/persistence/opensearch/dao/OpenSearchAnySearchDAO.java b/ext/opensearch/persistence/src/main/java/org/apache/syncope/core/persistence/opensearch/dao/OpenSearchAnySearchDAO.java
index 6d4e05c..37b93ea 100644
--- a/ext/opensearch/persistence/src/main/java/org/apache/syncope/core/persistence/opensearch/dao/OpenSearchAnySearchDAO.java
+++ b/ext/opensearch/persistence/src/main/java/org/apache/syncope/core/persistence/opensearch/dao/OpenSearchAnySearchDAO.java
@@ -530,7 +530,7 @@
 
             case ILIKE:
                 StringBuilder output = new StringBuilder();
-                for (char c : cond.getExpression().toLowerCase().toCharArray()) {
+                for (char c : cond.getExpression().toLowerCase().replace("\\_", "_").toCharArray()) {
                     if (c == '%') {
                         output.append(".*");
                     } else if (Character.isLetter(c)) {
@@ -548,7 +548,8 @@
 
             case LIKE:
                 query = new Query.Builder().wildcard(QueryBuilders.wildcard().
-                        field(schema.getKey()).value(cond.getExpression().replace('%', '*')).build()).build();
+                        field(schema.getKey()).value(cond.getExpression().replace('%', '*').replace("\\_", "_")).
+                        build()).build();
                 break;
 
             case IEQ: