From 61133a6f8a3f23cdc23346c908b75576109a0d22 Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Thu, 7 Mar 2013 13:03:19 -0500 Subject: [PATCH] improve search - prioritize exact matches of words, either in name or terms - prioritize fuzzy name matches over fuzzy term matches - reduce max difference to 2 --- js/id/presets/collection.js | 54 ++++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 21 deletions(-) diff --git a/js/id/presets/collection.js b/js/id/presets/collection.js index 6181ed327..94b53083a 100644 --- a/js/id/presets/collection.js +++ b/js/id/presets/collection.js @@ -39,32 +39,44 @@ iD.presets.Collection = function(collection) { value = value.toLowerCase(); - var substring_name = _.filter(collection, function(a) { - return a.name.indexOf(value) !== -1; - }), - substring_terms = _.filter(collection, function(a) { - return _.any(a.match.terms || [], function(b) { - return iD.util.editDistance(value, b) - b.length + value.length < 3; + var leading_name = _.filter(collection, function(a) { + return leading(a.name); + }), + leading_terms = _.filter(collection, function(a) { + return _.any(a.match.terms || [], leading); }); - }), - levenstein_name = collection.map(function(a) { - return { preset: a, dist: iD.util.editDistance(value, a.name) }; - }).filter(function(a) { - return a.dist - a.preset.name.length + value.length < 3; - }).sort(function(a, b) { - return a.dist - b.dist; - }).map(function(a) { - return a.preset; - }), - other = _.find(collection, function(a) { - return a.name === 'other'; - }); + + function leading(a) { + var index = a.indexOf(value); + return index === 0 || a[index - 1] === ' '; + } + + var levenstein_name = collection.map(function(a) { + return { + preset: a, + dist: iD.util.editDistance(value, a.name) + }; + }).filter(function(a) { + return a.dist - a.preset.name.length + value.length < 2; + }).sort(function(a, b) { + return a.dist - b.dist; + }).map(function(a) { + return a.preset; + }), + leventstein_terms = _.filter(collection, function(a) { + return _.any(a.match.terms || [], function(b) { + return iD.util.editDistance(value, b) - b.length + value.length < 2; + }); + }); + + var other = presets.item('other'); return iD.presets.Collection( _.unique( - substring_name.concat( - substring_terms, + leading_name.concat( + leading_terms, levenstein_name, + leventstein_terms, other))); } };