internal/postgres: dedupe symbolsearch merged results

When merging search results from two parallel queries, it is possible
for the same result to be returned by each query. These results are now
deduped.

For golang/go#44142

Change-Id: I3af41acdb6ad17a37165742f42318bda1813ae47
Reviewed-on: https://go-review.googlesource.com/c/pkgsite/+/340392
Trust: Julie Qiu <julie@golang.org>
Run-TryBot: Julie Qiu <julie@golang.org>
TryBot-Result: kokoro <noreply+kokoro@google.com>
Reviewed-by: Jonathan Amsterdam <jba@google.com>
diff --git a/internal/postgres/symbolsearch.go b/internal/postgres/symbolsearch.go
index d86ae3f..9247e55 100644
--- a/internal/postgres/symbolsearch.go
+++ b/internal/postgres/symbolsearch.go
@@ -187,8 +187,15 @@
 
 func mergedResults(resultsArray [][]*SearchResult, limit int) []*SearchResult {
 	var results []*SearchResult
-	for _, r := range resultsArray {
-		results = append(results, r...)
+	deduped := map[string]bool{}
+	for _, array := range resultsArray {
+		for _, r := range array {
+			key := fmt.Sprintf("%s@%s", r.PackagePath, r.SymbolName)
+			if !deduped[key] {
+				results = append(results, r)
+				deduped[key] = true
+			}
+		}
 	}
 	sort.Slice(results, func(i, j int) bool { return results[i].NumImportedBy > results[j].NumImportedBy })
 	if len(results) > limit {