From 36a011b36f98bee6252929d581eaf495e7134b61 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?France=CC=81=20Wilke?= <francewilke@gmail.com>
Date: Fri, 17 Dec 2021 15:14:11 +0200
Subject: [PATCH] Add function to escape OpenSearch search query string

---
 string_utils/string_utils.go | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/string_utils/string_utils.go b/string_utils/string_utils.go
index 7dcaae8..84720fd 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
+}
-- 
GitLab