49 lines
951 B
Go
49 lines
951 B
Go
|
|
package placement
|
||
|
|
|
||
|
|
import (
|
||
|
|
"strings"
|
||
|
|
)
|
||
|
|
|
||
|
|
func ScoreProductForTag(searchTag string, matchTags []string) int {
|
||
|
|
tag := strings.TrimSpace(strings.ToLower(searchTag))
|
||
|
|
if tag == "" || len(matchTags) == 0 {
|
||
|
|
return 0
|
||
|
|
}
|
||
|
|
best := 0
|
||
|
|
for _, raw := range matchTags {
|
||
|
|
candidate := strings.TrimSpace(strings.ToLower(raw))
|
||
|
|
if candidate == "" {
|
||
|
|
continue
|
||
|
|
}
|
||
|
|
switch {
|
||
|
|
case tag == candidate:
|
||
|
|
best = maxInt(best, 100)
|
||
|
|
case strings.Contains(tag, candidate) || strings.Contains(candidate, tag):
|
||
|
|
best = maxInt(best, 70)
|
||
|
|
default:
|
||
|
|
tagWords := strings.Fields(tag)
|
||
|
|
candWords := strings.Fields(candidate)
|
||
|
|
overlap := 0
|
||
|
|
for _, w := range tagWords {
|
||
|
|
for _, c := range candWords {
|
||
|
|
if strings.Contains(c, w) || strings.Contains(w, c) {
|
||
|
|
overlap++
|
||
|
|
break
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if overlap > 0 {
|
||
|
|
best = maxInt(best, 40+overlap*10)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return best
|
||
|
|
}
|
||
|
|
|
||
|
|
func maxInt(a, b int) int {
|
||
|
|
if a > b {
|
||
|
|
return a
|
||
|
|
}
|
||
|
|
return b
|
||
|
|
}
|