diff --git a/string_utils/string_utils.go b/string_utils/string_utils.go
index 7dcaae8af02cca45d2d51395dc2a73b50eccd0f0..84720fde9faa754ef4ec7977a5e1fd06f918a256 100644
--- a/string_utils/string_utils.go
+++ b/string_utils/string_utils.go
@@ -218,3 +218,25 @@ func RemoveUrlScheme(str string) string {
 	newStr = strings.Replace(str, "https://", "", 1)
 	return newStr
 }
+
+// EscapeOpenSearchSearchString See https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html#_reserved_characters
+func EscapeOpenSearchSearchString(str string) string {
+	searchString := str
+
+	// Reserved characters
+	// NOTE: first char must be "\" to prevent replacing it again after replacing other chars with "\\"
+	reservedCharacters := []string{"\\", "+", "-", "=", "&&", "||", "!", "(", ")", "{", "}", "[", "]", "^", "\"", "~", "*", "?", ":", "/"}
+
+	// Remove "<" and ">"
+	strings.ReplaceAll(searchString, "<", "")
+	strings.ReplaceAll(searchString, ">", "")
+
+	// Escape the reserved characters with double backslashes ("\\")
+	for _, char := range reservedCharacters {
+		if strings.Contains(searchString, char) {
+			re := regexp.MustCompile(char)
+			searchString = re.ReplaceAllString(searchString, "\\"+char)
+		}
+	}
+	return searchString
+}