Improve Search Performance and Result Quality

This commit is contained in:
2025-04-11 14:55:52 +02:00
parent 642f1d61d2
commit 3e59d043a7
11 changed files with 187 additions and 77 deletions

View File

@@ -110,30 +110,40 @@ func BuildBuffer(searchTerm string) error {
splitSearchTerms := strings.Split(searchTerm, " ")
splitSearchTerms = append(splitSearchTerms, searchTerm)
splitSearchTerms = append(splitSearchTerms, strings.ReplaceAll(searchTerm, " ", searchTerm))
if len(splitSearchTerms) > 1 {
splitSearchTerms = append(splitSearchTerms, searchTerm)
splitSearchTerms = append(splitSearchTerms, strings.ReplaceAll(searchTerm, " ", ""))
}
var fuzzyResults []fuzzyResult
for viewName, targets := range searchTargets {
totalHits := 0
perfectHits := 0
var totalDistance float32
for i, splitSearchTerm := range splitSearchTerms {
if splitSearchTerm == "" {
continue
}
ranks := fuzzy.RankFindFold(splitSearchTerm, targets)
hits := len(ranks)
if hits == 0 {
if i < len(splitSearchTerm)-3 {
totalDistance += 500
}
continue
/*if hits == 0 {
if i < len(splitSearchTerm)-3 {
totalDistance += 500
}
continue
}*/
totalHits += hits
var averageDistance float32 = 0
for _, rank := range ranks {
averageDistance += float32(rank.Distance)
if i >= len(splitSearchTerms)-2 && rank.Distance == 0 {
perfectHits += 1
}
}
totalDistance += averageDistance / float32(hits)
@@ -144,7 +154,7 @@ func BuildBuffer(searchTerm string) error {
CDSViewTechnicalName: viewName,
hits: totalHits,
averageDistance: totalDistance,
score: totalDistance / float32(totalHits),
score: (float32(len(targets)) / float32(totalHits)) / float32(perfectHits),
})
}
}
@@ -160,6 +170,11 @@ func BuildBuffer(searchTerm string) error {
} else if a.score < b.score {
return -1
}
if a.CDSViewTechnicalName > b.CDSViewTechnicalName {
return 1
} else if a.CDSViewTechnicalName < b.CDSViewTechnicalName {
return -1
}
return 0
})
@@ -192,14 +207,22 @@ func HandleSearch(w http.ResponseWriter, r *http.Request) {
defer buffer.mu.Unlock()
page := GetPage(r)
var maxPage int
if buffer.hits <= pageStep {
maxPage = 0
} else {
maxPage = (buffer.hits / pageStep)
}
maxPage := (buffer.hits / pageStep) - 1
if page+1 > maxPage {
page = maxPage
}
resultsModel := model.NewResultsModel()
for i := page * pageStep; i < page*pageStep+pageStep; i++ {
if i > len(buffer.results)-1 {
break
}
result := buffer.results[i]
cdsView, err := model.GetCDSViewModel(result.CDSViewTechnicalName)
if err != nil {
@@ -207,7 +230,7 @@ func HandleSearch(w http.ResponseWriter, r *http.Request) {
continue
}
resultsModel.AppendResultsModelViews(cdsView)
resultsModel.AppendResultsModelViews(cdsView, result.score)
}
resultsModel.SearchTerm = searchTerm