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 +}