Improve Search Performance and Result Quality
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user