Archived
1
0
Fork 0

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