|
function createFuzzyScorer(text) { |
|
|
|
var UNIVERSAL_MAX = 1e9; |
|
|
|
var matcher = makeFuzzyRegex(text); |
|
|
|
return function(query) { |
|
var match = matcher.exec(query); |
|
|
|
if (!match) return 0; |
|
|
|
var captures = match.slice(1); |
|
var score = 0; console.log(captures); |
|
|
|
for (var i = 0, l = captures.length; i < l; i += 3) { |
|
var relevancyOfCharacter = Math.pow(i + 1, -2); |
|
if (captures[i]) score -= relevancyOfCharacter * 0.1; |
|
if (captures[i+1]) score += relevancyOfCharacter * 1; |
|
if (captures[i+2]) score -= relevancyOfCharacter * 0.1; |
|
} |
|
|
|
return score; |
|
}; |
|
|
|
function makeFuzzyRegex(string) { |
|
|
|
if (!string) { return /^$/; } |
|
|
|
// Escape any potential special characters: |
|
var cleansed = string.replace(/\W/g, '\\$&'); |
|
|
|
return RegExp( |
|
'^' + |
|
cleansed.replace( |
|
// Find every escaped and non-escaped char: |
|
/(\\?.)/g, |
|
// Replace with fuzzy character matcher: |
|
'(?:(^.)?($1)(.??))?' |
|
) + |
|
'$', |
|
'i' |
|
); |
|
} |
|
} |
This comment has been minimized.
michacom commentedJul 21, 2015
may it be better, if you code w/o
slice
and start thefor
from 1, atmakeFuzzyRegex
function?