diff options
author | mpearson@chromium.org <mpearson@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-21 17:32:41 +0000 |
---|---|---|
committer | mpearson@chromium.org <mpearson@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-21 17:32:41 +0000 |
commit | 1be0b45815e548f453be4e1dae88842afb6e0d6c (patch) | |
tree | 9e2133acec42deb77c607b17db6315596627c3b7 | |
parent | aa44546e0270e7cff9d934d9d5dc236df2030e99 (diff) | |
download | chromium_src-1be0b45815e548f453be4e1dae88842afb6e0d6c.zip chromium_src-1be0b45815e548f453be4e1dae88842afb6e0d6c.tar.gz chromium_src-1be0b45815e548f453be4e1dae88842afb6e0d6c.tar.bz2 |
Omnibox: Add Field Trial to Make Shortcuts More Aggressive
Change ShortcutsProvider so it can assign high relevance scores.
Simultaneously, make ShortcutsProvider explicitly enforce the rule
that it should not return a result with an inlineable score (>=1200).
Finally, create a field trial that will allow the server to specify
the maximum relevance score ShortcutsProvider can assign. Setting this
to 1199 will maintain current behavior. Also, if the field trial is
not enabled through the variations server, Chrome will maintain the
current behavior.
BUG=252032
TEST=enter omnibox inputs that you've used before to get places (and hence shortcuts will have data about them) into about:omnibox and look at the resulting scores. Try again with --force-fieldtrials=OmniboxShortcutsScoring/MaxRelevance_XXX/ (where XXX is a number) and see how the scores change.
Review URL: https://chromiumcodereview.appspot.com/17261012
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@207872 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/autocomplete/shortcuts_provider.cc | 20 | ||||
-rw-r--r-- | chrome/browser/autocomplete/shortcuts_provider.h | 9 | ||||
-rw-r--r-- | chrome/browser/autocomplete/shortcuts_provider_unittest.cc | 16 | ||||
-rw-r--r-- | chrome/browser/omnibox/omnibox_field_trial.cc | 18 | ||||
-rw-r--r-- | chrome/browser/omnibox/omnibox_field_trial.h | 16 |
5 files changed, 67 insertions, 12 deletions
diff --git a/chrome/browser/autocomplete/shortcuts_provider.cc b/chrome/browser/autocomplete/shortcuts_provider.cc index 21d7b5e..1d380b3 100644 --- a/chrome/browser/autocomplete/shortcuts_provider.cc +++ b/chrome/browser/autocomplete/shortcuts_provider.cc @@ -25,6 +25,7 @@ #include "chrome/browser/history/history_service.h" #include "chrome/browser/history/history_service_factory.h" #include "chrome/browser/history/shortcuts_backend_factory.h" +#include "chrome/browser/omnibox/omnibox_field_trial.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/pref_names.h" #include "chrome/common/url_constants.h" @@ -53,7 +54,8 @@ ShortcutsProvider::ShortcutsProvider(AutocompleteProviderListener* listener, : AutocompleteProvider(listener, profile, AutocompleteProvider::TYPE_SHORTCUTS), languages_(profile_->GetPrefs()->GetString(prefs::kAcceptLanguages)), - initialized_(false) { + initialized_(false), + max_relevance_(AutocompleteResult::kLowestDefaultScore - 1) { scoped_refptr<history::ShortcutsBackend> backend = ShortcutsBackendFactory::GetForProfile(profile_); if (backend.get()) { @@ -61,6 +63,9 @@ ShortcutsProvider::ShortcutsProvider(AutocompleteProviderListener* listener, if (backend->initialized()) initialized_ = true; } + int max_relevance; + if (OmniboxFieldTrial::ShortcutsScoringMaxRelevance(&max_relevance)) + max_relevance_ = max_relevance; } void ShortcutsProvider::Start(const AutocompleteInput& input, @@ -169,6 +174,16 @@ void ShortcutsProvider::GetMatches(const AutocompleteInput& input) { matches_.erase(matches_.begin() + AutocompleteProvider::kMaxMatches, matches_.end()); } + // Reset relevance scores to guarantee no results are given an + // inlineable score and all scores are decreasing (but not do assign + // any scores below 1). + int max_relevance = AutocompleteResult::kLowestDefaultScore - 1; + for (ACMatches::iterator it = matches_.begin(); it != matches_.end(); ++it) { + max_relevance = std::min(max_relevance, it->relevance); + it->relevance = max_relevance; + if (max_relevance > 1) + --max_relevance; + } } AutocompleteMatch ShortcutsProvider::ShortcutToACMatch( @@ -321,7 +336,6 @@ history::ShortcutsBackend::ShortcutMap::const_iterator backend->shortcuts_map().end(); } -// static int ShortcutsProvider::CalculateScore( const string16& terms, const history::ShortcutsBackend::Shortcut& shortcut) { @@ -334,7 +348,7 @@ int ShortcutsProvider::CalculateScore( // directly. This makes sense since the first characters typed are much more // important for determining how likely it is a user wants a particular // shortcut than are the remaining continued characters. - double base_score = (AutocompleteResult::kLowestDefaultScore - 1) * + double base_score = max_relevance_ * sqrt(static_cast<double>(terms.length()) / shortcut.text.length()); // Then we decay this by half each week. diff --git a/chrome/browser/autocomplete/shortcuts_provider.h b/chrome/browser/autocomplete/shortcuts_provider.h index b4b0fc9..11f0b0a 100644 --- a/chrome/browser/autocomplete/shortcuts_provider.h +++ b/chrome/browser/autocomplete/shortcuts_provider.h @@ -94,12 +94,19 @@ class ShortcutsProvider const string16& keyword, history::ShortcutsBackend* backend); - static int CalculateScore( + int CalculateScore( const string16& terms, const history::ShortcutsBackend::Shortcut& shortcut); std::string languages_; bool initialized_; + + // The maximum relevance that can be assigned in CalculateScore(). + // Note that if the final assigned relevance is at least + // AutocompleteResult::kLowestDefaultScore, the relevance will be + // demoted to less than that number because ShortcutsProvider isn't + // allowed to inline. + int max_relevance_; }; #endif // CHROME_BROWSER_AUTOCOMPLETE_SHORTCUTS_PROVIDER_H_ diff --git a/chrome/browser/autocomplete/shortcuts_provider_unittest.cc b/chrome/browser/autocomplete/shortcuts_provider_unittest.cc index bc1034c..9b2b4e4 100644 --- a/chrome/browser/autocomplete/shortcuts_provider_unittest.cc +++ b/chrome/browser/autocomplete/shortcuts_provider_unittest.cc @@ -573,37 +573,37 @@ TEST_F(ShortcutsProviderTest, CalculateScore) { spans_description, base::Time::Now(), 1); // Maximal score. - const int kMaxScore = ShortcutsProvider::CalculateScore( + const int kMaxScore = provider_->CalculateScore( ASCIIToUTF16("test"), shortcut); // Score decreases as percent of the match is decreased. int score_three_quarters = - ShortcutsProvider::CalculateScore(ASCIIToUTF16("tes"), shortcut); + provider_->CalculateScore(ASCIIToUTF16("tes"), shortcut); EXPECT_LT(score_three_quarters, kMaxScore); int score_one_half = - ShortcutsProvider::CalculateScore(ASCIIToUTF16("te"), shortcut); + provider_->CalculateScore(ASCIIToUTF16("te"), shortcut); EXPECT_LT(score_one_half, score_three_quarters); int score_one_quarter = - ShortcutsProvider::CalculateScore(ASCIIToUTF16("t"), shortcut); + provider_->CalculateScore(ASCIIToUTF16("t"), shortcut); EXPECT_LT(score_one_quarter, score_one_half); // Should decay with time - one week. shortcut.last_access_time = base::Time::Now() - base::TimeDelta::FromDays(7); int score_week_old = - ShortcutsProvider::CalculateScore(ASCIIToUTF16("test"), shortcut); + provider_->CalculateScore(ASCIIToUTF16("test"), shortcut); EXPECT_LT(score_week_old, kMaxScore); // Should decay more in two weeks. shortcut.last_access_time = base::Time::Now() - base::TimeDelta::FromDays(14); int score_two_weeks_old = - ShortcutsProvider::CalculateScore(ASCIIToUTF16("test"), shortcut); + provider_->CalculateScore(ASCIIToUTF16("test"), shortcut); EXPECT_LT(score_two_weeks_old, score_week_old); // But not if it was activly clicked on. 2 hits slow decaying power. shortcut.number_of_hits = 2; shortcut.last_access_time = base::Time::Now() - base::TimeDelta::FromDays(14); int score_popular_two_weeks_old = - ShortcutsProvider::CalculateScore(ASCIIToUTF16("test"), shortcut); + provider_->CalculateScore(ASCIIToUTF16("test"), shortcut); EXPECT_LT(score_two_weeks_old, score_popular_two_weeks_old); // But still decayed. EXPECT_LT(score_popular_two_weeks_old, kMaxScore); @@ -612,7 +612,7 @@ TEST_F(ShortcutsProviderTest, CalculateScore) { shortcut.number_of_hits = 3; shortcut.last_access_time = base::Time::Now() - base::TimeDelta::FromDays(14); int score_more_popular_two_weeks_old = - ShortcutsProvider::CalculateScore(ASCIIToUTF16("test"), shortcut); + provider_->CalculateScore(ASCIIToUTF16("test"), shortcut); EXPECT_LT(score_two_weeks_old, score_more_popular_two_weeks_old); EXPECT_LT(score_popular_two_weeks_old, score_more_popular_two_weeks_old); // But still decayed. diff --git a/chrome/browser/omnibox/omnibox_field_trial.cc b/chrome/browser/omnibox/omnibox_field_trial.cc index 4ec2c5c..da16943 100644 --- a/chrome/browser/omnibox/omnibox_field_trial.cc +++ b/chrome/browser/omnibox/omnibox_field_trial.cc @@ -22,6 +22,7 @@ const char kHUPCullRedirectsFieldTrialName[] = "OmniboxHUPCullRedirects"; const char kHUPCreateShorterMatchFieldTrialName[] = "OmniboxHUPCreateShorterMatch"; const char kStopTimerFieldTrialName[] = "OmniboxStopTimer"; +const char kShortcutsScoringFieldTrialName[] = "OmniboxShortcutsScoring"; // The autocomplete dynamic field trial name prefix. Each field trial is // configured dynamically and is retrieved automatically by Chrome during @@ -240,3 +241,20 @@ bool OmniboxFieldTrial::InZeroSuggestFieldTrial() { } return false; } + +// If the active group name starts with "MaxRelevance_", extract the +// int that immediately following that, returning true on success. +bool OmniboxFieldTrial::ShortcutsScoringMaxRelevance(int* max_relevance) { + std::string group_name = + base::FieldTrialList::FindFullName(kShortcutsScoringFieldTrialName); + const char kMaxRelevanceGroupPrefix[] = "MaxRelevance_"; + if (!StartsWithASCII(group_name, kMaxRelevanceGroupPrefix, true)) + return false; + if (!base::StringToInt(base::StringPiece( + group_name.substr(strlen(kMaxRelevanceGroupPrefix))), + max_relevance)) { + LOG(WARNING) << "Malformed MaxRelevance string: " << group_name; + return false; + } + return true; +} diff --git a/chrome/browser/omnibox/omnibox_field_trial.h b/chrome/browser/omnibox/omnibox_field_trial.h index e6f0345..ab5babc 100644 --- a/chrome/browser/omnibox/omnibox_field_trial.h +++ b/chrome/browser/omnibox/omnibox_field_trial.h @@ -97,6 +97,22 @@ class OmniboxFieldTrial { // user clicks on the omnibox but has not typed anything yet. static bool InZeroSuggestFieldTrial(); + // --------------------------------------------------------- + // For the ShortcutsScoring field trial. + + // If the field trial is active and the user is in an experiment + // group, extract from the experiment group name the maximum + // relevance score ShortcutsProvider:: CalculateScore() can return. + // Returns true on a successful extraction. If the extraction failed, + // if the field trial is not active, etc., returns false. + // CalculateScore()'s return value is a product of this maximum + // relevance score and some attenuating factors that are all between + // 0 and 1. (Note that Shortcuts results may have their scores + // reduced later if the assigned score is higher than allowed for + // non-inlineable results. Shortcuts results are not allowed to be + // inlined.) + static bool ShortcutsScoringMaxRelevance(int* max_relevance); + private: DISALLOW_IMPLICIT_CONSTRUCTORS(OmniboxFieldTrial); }; |