-
Notifications
You must be signed in to change notification settings - Fork 1
/
strings.go
83 lines (67 loc) · 2.3 KB
/
strings.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package goutils
import (
"net/url"
"regexp"
"strings"
"unicode/utf8"
)
// Remove Vietnamese accents
func RemoveAccents(s string) string {
viChars := "ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚÝàáâãèéêìíòóôõùúýĂăĐđĨĩŨũƠơƯưẠạẢảẤấẦầẨẩẪẫẬậẮắẰằẲẳẴẵẶặẸẹẺẻẼẽẾếỀềỂểỄễỆệỈỉỊịỌọỎỏỐốỒồỔổỖỗỘộỚớỜờỞởỠỡỢợỤụỦủỨứỪừỬửỮữỰựỲỳỴỵỶỷỸỹ"
enChars := "AAAAEEEIIOOOOUUYaaaaeeeiioooouuyAaDdIiUuOoUuAaAaAaAaAaAaAaAaAaAaAaAaEeEeEeEeEeEeEeEeIiIiOoOoOoOoOoOoOoOoOoOoOoOoUuUuUuUuUuUuUuYyYyYyYy"
var r = ""
for _, c := range s {
i := strings.IndexRune(viChars, c)
if i >= 0 {
i = utf8.RuneCountInString(viChars[:i])
r += string(enChars[i])
} else {
r += string(c)
}
}
return r
}
// Remove special characters
func RemoveSpecialChar(s string) string {
return strings.TrimSpace(strings.ReplaceAll(regexp.MustCompile(`[^\p{L}\p{N} ]+`).ReplaceAllString(s, ""), " ", " "))
}
// Convert a string to URL format
func ToURL(s string) string {
s = strings.ToLower(RemoveAccents(s))
s = RemoveSpecialChar(s)
s = strings.ReplaceAll(s, " ", "-")
_, err := url.Parse(s)
if err != nil {
return ""
}
return s
}
// Clean and split keywords
func CleanKeyword(kw string) []string {
kw = strings.ToLower(strings.TrimSpace(kw))
// remove leading numbers
kw = regexp.MustCompile(`^(\d+)\s+`).ReplaceAllString(kw, "")
var keywords []string
keywords = append(keywords, strings.Split(kw, ",")...)
// remove special characters and trim spaces
for i, k := range keywords {
keywords[i] = RemoveSpecialChar(k)
}
keywords = Deduplicate(keywords)
return keywords
}
/*
Generate Elasticsearch query string
View more: https://www.elastic.co/guide/en/elasticsearch/reference/7.17/query-dsl-query-string-query.html
Example: ((\"hcm\") AND (\"quận1\")) OR ((\"hcm\") AND (\"quan1\"))
*/
func ToDSLQueryString( /*Note: Clean keyword firstly*/ freshKw string) string {
viWords := strings.Split(freshKw, " ")
var enWords []string
for _, word := range viWords {
enWords = append(enWords, RemoveAccents(word))
}
viQuery := "(" + strings.Join(viWords, " AND ") + ")"
enQuery := "(" + strings.Join(enWords, " AND ") + ")"
return viQuery + " OR " + enQuery
}