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:
		
							parent
							
								
									373cc3b74a
								
							
						
					
					
						commit
						fd1395c498
					
				
					 1 changed files with 8 additions and 5 deletions
				
			
		
							
								
								
									
										13
									
								
								guix/ui.scm
									
										
									
									
									
								
							
							
						
						
									
										13
									
								
								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))))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Reference in a new issue