From 68811fa324763ec002065b94088dbba80481e063 Mon Sep 17 00:00:00 2001 From: pc223 <10551242+pc223@users.noreply.github.com> Date: Thu, 29 Jul 2021 09:43:32 +0700 Subject: [PATCH 1/3] Add demo for FuzzySharp (Levenshtein) --- .../SharedModels/MatchResult.cs | 4 ++-- .../Flow.Launcher.Plugin.Program.csproj | 1 + .../Programs/Win32.cs | 18 +++++++++++++++++- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/Flow.Launcher.Plugin/SharedModels/MatchResult.cs b/Flow.Launcher.Plugin/SharedModels/MatchResult.cs index 5144eb61d66..61b30b06cc1 100644 --- a/Flow.Launcher.Plugin/SharedModels/MatchResult.cs +++ b/Flow.Launcher.Plugin/SharedModels/MatchResult.cs @@ -65,8 +65,8 @@ private int ScoreAfterSearchPrecisionFilter(int rawScore) public enum SearchPrecisionScore { - Regular = 50, - Low = 20, + Regular = 0, + Low = 0, None = 0 } } diff --git a/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj b/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj index 2eb04b5a9ff..acf251a9f95 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj +++ b/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj @@ -58,6 +58,7 @@ + diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs index 931cfacc16d..8dff079e749 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs +++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs @@ -93,10 +93,26 @@ public Result Result(string query, IPublicAPI api) matchResult.MatchData = new List(); } + + + + + var newScore = FuzzySharp.Fuzz.PartialTokenSetRatio(query.ToLower(), Name.ToLower()); + if (Name.Length < query.Length) + newScore = 0; + + var oldScore = matchResult.RawScore; + matchResult.RawScore = Math.Max(newScore, oldScore); + matchResult.MatchData = new List(); + + + + + var result = new Result { - Title = title, + Title = title + $"<{matchResult.Score}> <{newScore}> <{oldScore}>", SubTitle = LnkResolvedPath ?? FullPath, IcoPath = IcoPath, Score = matchResult.Score, From d0467c6f14c83ca9f0d5e0d3735b5228ead09290 Mon Sep 17 00:00:00 2001 From: pc223 <10551242+pc223@users.noreply.github.com> Date: Thu, 29 Jul 2021 10:08:58 +0700 Subject: [PATCH 2/3] Bypass SearchPrecisionScore and related tests --- .../SharedModels/MatchResult.cs | 4 ++-- .../Programs/Win32.cs | 21 ++++++++++--------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/Flow.Launcher.Plugin/SharedModels/MatchResult.cs b/Flow.Launcher.Plugin/SharedModels/MatchResult.cs index 61b30b06cc1..5144eb61d66 100644 --- a/Flow.Launcher.Plugin/SharedModels/MatchResult.cs +++ b/Flow.Launcher.Plugin/SharedModels/MatchResult.cs @@ -65,8 +65,8 @@ private int ScoreAfterSearchPrecisionFilter(int rawScore) public enum SearchPrecisionScore { - Regular = 0, - Low = 0, + Regular = 50, + Low = 20, None = 0 } } diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs index 8dff079e749..bd05240d4e5 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs +++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs @@ -83,16 +83,16 @@ public Result Result(string query, IPublicAPI api) else matchResult = nameMatch; } - if (!matchResult.IsSearchPrecisionScoreMet()) - { - if (ExecutableName != null) // only lnk program will need this one - matchResult = StringMatcher.FuzzySearch(query, ExecutableName); - - if (!matchResult.IsSearchPrecisionScoreMet()) - return null; - - matchResult.MatchData = new List(); - } + // if (!matchResult.IsSearchPrecisionScoreMet()) + // { + // if (ExecutableName != null) // only lnk program will need this one + // matchResult = StringMatcher.FuzzySearch(query, ExecutableName); + // + // if (!matchResult.IsSearchPrecisionScoreMet()) + // return null; + // + // matchResult.MatchData = new List(); + // } @@ -104,6 +104,7 @@ public Result Result(string query, IPublicAPI api) var oldScore = matchResult.RawScore; matchResult.RawScore = Math.Max(newScore, oldScore); + matchResult.RawScore *= 10; // Bypass the SearchPrecisionScore and related tests matchResult.MatchData = new List(); From bf579d1d90318a152713c0aeae90568a9f56b774 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sat, 12 Apr 2025 21:32:58 +0800 Subject: [PATCH 3/3] Test fuzzy search --- .../SharedModels/MatchResult.cs | 2 +- .../Programs/Win32.cs | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/Flow.Launcher.Plugin/SharedModels/MatchResult.cs b/Flow.Launcher.Plugin/SharedModels/MatchResult.cs index 36677d4bb29..a48347034b4 100644 --- a/Flow.Launcher.Plugin/SharedModels/MatchResult.cs +++ b/Flow.Launcher.Plugin/SharedModels/MatchResult.cs @@ -41,7 +41,7 @@ public MatchResult(bool success, SearchPrecisionScore searchPrecision, List /// /// The final score of the match result with search precision filters applied. /// - public int Score { get; private set; } + public int Score { get; set; } /// /// The raw calculated search score without any search precision filtering applied. diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs index df22e24b1fb..1c1ea078b1b 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs +++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs @@ -91,12 +91,26 @@ private static MatchResult Match(string query, IReadOnlyCollection candi if (candidates.Count == 0) return null; - var match = candidates.Select(candidate => Main.Context.API.FuzzySearch(query, candidate)) + var match = candidates.Select(candidate => + { + var matchResult = Main.Context.API.FuzzySearch(query, candidate); + matchResult.Score = FuzzySearch(query, candidate); + return matchResult; + }) .MaxBy(match => match.Score); return match?.IsSearchPrecisionScoreMet() ?? false ? match : null; } + private static int FuzzySearch(string query, string stringToCompare) + { + var newScore = FuzzySharp.Fuzz.PartialTokenSetRatio(query.ToLower(), stringToCompare.ToLower()); + if (stringToCompare.Length < query.Length) + newScore = 0; + + return newScore; + } + public Result Result(string query, IPublicAPI api) { string title; @@ -112,13 +126,16 @@ public Result Result(string query, IPublicAPI api) { title = resultName; matchResult = Main.Context.API.FuzzySearch(query, resultName); + matchResult.Score = FuzzySearch(query, resultName); } else { // Search in both title = $"{resultName}: {Description}"; var nameMatch = Main.Context.API.FuzzySearch(query, resultName); + nameMatch.Score = FuzzySearch(query, resultName); var descriptionMatch = Main.Context.API.FuzzySearch(query, Description); + descriptionMatch.Score = FuzzySearch(query, Description); if (descriptionMatch.Score > nameMatch.Score) { for (int i = 0; i < descriptionMatch.MatchData.Count; i++)