ui: Increase relevance score for exact matches.

Previously "guix package -s python" would have 'python2-zope-interface' as
its first result (relevance: 10), followed by many other python-*
packages with the same score, while 'python' itself would come
later (relevance: 7).

This change makes 'python' the first result (relevance: 27).

Reported by Gábor Boskovits.

* guix/ui.scm (relevance)[score]: Use 'fold-matches' instead of
'match:count' to counter the number of maches.  Give more weight to
exact matches.
This commit is contained in:
Ludovic Courtès 2018-06-29 12:17:41 +02:00
parent 373cc3b74a
commit fd1395c498
No known key found for this signature in database
GPG Key ID: 090B11993D9AEBB5

View File

@ -1222,11 +1222,14 @@ field in the final score.
A score of zero means that OBJ does not match any of REGEXPS. The higher the
score, the more relevant OBJ is to REGEXPS."
(define (score str)
(let ((counts (filter-map (lambda (regexp)
(match (regexp-exec regexp str)
(#f #f)
(m (match:count m))))
regexps)))
(let ((counts (map (lambda (regexp)
(match (fold-matches regexp str '() cons)
(() 0)
((m) (if (string=? (match:substring m) str)
5 ;exact match
1))
(lst (length lst))))
regexps)))
;; Compute a score that's proportional to the number of regexps matched
;; and to the number of matches for each regexp.
(* (length counts) (reduce + 0 counts))))