Commit 0065d724 authored by tby's avatar tby Committed by Commit Bot

[Duplicate files] Score file search results with fuzzy string matching

Currently all file results have score 0.5, so let's add some scoring
logic. This CL uses the fuzzy string match algorithm also used for apps
to score file results.

Bug: 1053637
Change-Id: Ia41dcca17c20909aec849ce3e0ee28f890bf6f2c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2396196
Commit-Queue: Tony Yeoman <tby@chromium.org>
Reviewed-by: default avatarThanh Nguyen <thanhdng@chromium.org>
Cr-Commit-Position: refs/heads/master@{#805988}
parent fa7339d4
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "base/metrics/histogram_macros.h" #include "base/metrics/histogram_macros.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "chrome/browser/chromeos/launcher_search_provider/launcher_search_provider_service.h" #include "chrome/browser/chromeos/launcher_search_provider/launcher_search_provider_service.h"
#include "chromeos/components/string_matching/fuzzy_tokenized_string_match.h"
using chromeos::launcher_search_provider::Service; using chromeos::launcher_search_provider::Service;
...@@ -17,9 +18,33 @@ namespace app_list { ...@@ -17,9 +18,33 @@ namespace app_list {
namespace { namespace {
using TokenizedString = chromeos::string_matching::TokenizedString;
using FuzzyTokenizedStringMatch =
chromeos::string_matching::FuzzyTokenizedStringMatch;
constexpr int kLauncherSearchProviderQueryDelayInMs = 100; constexpr int kLauncherSearchProviderQueryDelayInMs = 100;
constexpr int kLauncherSearchProviderMaxResults = 6; constexpr int kLauncherSearchProviderMaxResults = 6;
constexpr double kDefaultRelevance = 0.5;
// Parameters for FuzzyTokenizedStringMatch. Note that the underlying file
// search uses an exact substring match to retrieve file results, so using edit
// distance here doesn't provide any benefit.
constexpr bool kUsePrefixOnly = false;
constexpr bool kUseWeightedRatio = true;
constexpr bool kUseEditDistance = false;
constexpr double kRelevanceThreshold = 0.0;
constexpr double kPartialMatchPenaltyRate = 0.9;
double FuzzyMatchRelevance(const TokenizedString& title,
const TokenizedString& query) {
FuzzyTokenizedStringMatch match;
match.IsRelevant(query, title, kRelevanceThreshold, kUsePrefixOnly,
kUseWeightedRatio, kUseEditDistance,
kPartialMatchPenaltyRate);
return match.relevance();
}
} // namespace } // namespace
LauncherSearchProvider::LauncherSearchProvider(Profile* profile) LauncherSearchProvider::LauncherSearchProvider(Profile* profile)
...@@ -49,6 +74,7 @@ void LauncherSearchProvider::Start(const base::string16& query) { ...@@ -49,6 +74,7 @@ void LauncherSearchProvider::Start(const base::string16& query) {
// Clear previously added search results. // Clear previously added search results.
ClearResults(); ClearResults();
last_tokenized_query_.emplace(query, TokenizedString::Mode::kWords);
DelayQuery(base::Bind(&LauncherSearchProvider::StartInternal, DelayQuery(base::Bind(&LauncherSearchProvider::StartInternal,
weak_ptr_factory_.GetWeakPtr(), query)); weak_ptr_factory_.GetWeakPtr(), query));
} }
...@@ -64,12 +90,25 @@ void LauncherSearchProvider::SetSearchResults( ...@@ -64,12 +90,25 @@ void LauncherSearchProvider::SetSearchResults(
// Add this extension's results (erasing any existing results). // Add this extension's results (erasing any existing results).
extension_results_[extension_id] = std::move(results); extension_results_[extension_id] = std::move(results);
DCHECK_LE(extension_results_.size(), 1);
// Update results with other extension results. // Update results with other extension results.
SearchProvider::Results new_results; SearchProvider::Results new_results;
for (const auto& item : extension_results_) { for (const auto& item : extension_results_) {
for (const auto& result : item.second) for (const auto& result : item.second) {
new_results.emplace_back(result->Duplicate()); std::unique_ptr<LauncherSearchResult> new_result = result->Duplicate();
double relevance = kDefaultRelevance;
if (last_tokenized_query_) {
const TokenizedString tokenized_title(new_result->title(),
TokenizedString::Mode::kWords);
relevance =
FuzzyMatchRelevance(tokenized_title, last_tokenized_query_.value());
}
new_result->set_relevance(relevance);
new_results.push_back(std::move(new_result));
}
} }
SwapResults(&new_results); SwapResults(&new_results);
} }
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/app_list/search/launcher_search/launcher_search_result.h" #include "chrome/browser/ui/app_list/search/launcher_search/launcher_search_result.h"
#include "chrome/browser/ui/app_list/search/search_provider.h" #include "chrome/browser/ui/app_list/search/search_provider.h"
#include "chromeos/components/string_matching/tokenized_string.h"
#include "extensions/common/extension_id.h" #include "extensions/common/extension_id.h"
namespace app_list { namespace app_list {
...@@ -54,6 +55,9 @@ class LauncherSearchProvider : public SearchProvider { ...@@ -54,6 +55,9 @@ class LauncherSearchProvider : public SearchProvider {
base::TimeTicks query_start_time_; base::TimeTicks query_start_time_;
base::Optional<chromeos::string_matching::TokenizedString>
last_tokenized_query_;
// The reference to profile to get LauncherSearchProvider service. // The reference to profile to get LauncherSearchProvider service.
Profile* profile_; Profile* profile_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment