summaryrefslogtreecommitdiff
path: root/guix/ui.scm
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2018-06-29 12:17:41 +0200
committerLudovic Courtès <ludo@gnu.org>2018-06-29 22:56:33 +0200
commitfd1395c4982dd8cf7fe9843317d1ebb1e5d78bee (patch)
treedb9fa59f040c2f94978a08f9f8441869c5b5dceb /guix/ui.scm
parent373cc3b74a6ad33fddf75c2d773a97b1775bda8e (diff)
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.
Diffstat (limited to 'guix/ui.scm')
-rw-r--r--guix/ui.scm13
1 files changed, 8 insertions, 5 deletions
diff --git a/guix/ui.scm b/guix/ui.scm
index ec709450d8..6996b7f1c4 100644
--- a/guix/ui.scm
+++ b/guix/ui.scm
@@ -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))))