Index: chrome/browser/autocomplete/history_contents_provider.cc |
diff --git a/chrome/browser/autocomplete/history_contents_provider.cc b/chrome/browser/autocomplete/history_contents_provider.cc |
index 61749a2841155cb1e5615ab0b1762d8d4bdb6df4..c231ca56fb05ec587e17620040816e6b854cfc43 100644 |
--- a/chrome/browser/autocomplete/history_contents_provider.cc |
+++ b/chrome/browser/autocomplete/history_contents_provider.cc |
@@ -17,6 +17,7 @@ |
#include "net/base/net_util.h" |
using base::TimeTicks; |
+using history::HistoryDatabase; |
namespace { |
@@ -24,31 +25,25 @@ namespace { |
// time it will take. |
const int kDaysToSearch = 30; |
-// When processing the results from the history query, this structure points to |
-// a single result. It allows the results to be sorted and processed without |
-// modifying the larger and slower results structure. |
-struct MatchReference { |
- MatchReference(const history::URLResult* result, int relevance) |
- : result(result), |
- relevance(relevance) { |
- } |
- |
- const history::URLResult* result; |
- int relevance; // Score of relevance computed by CalculateRelevance. |
-}; |
- |
-// This is a > operator for MatchReference. |
-bool CompareMatchRelevance(const MatchReference& a, const MatchReference& b) { |
- if (a.relevance != b.relevance) |
- return a.relevance > b.relevance; |
+} // end namespace |
- // Want results in reverse-chronological order all else being equal. |
- return a.result->last_visit() > b.result->last_visit(); |
+HistoryContentsProvider::MatchReference::MatchReference( |
+ const history::URLResult* result, |
+ int relevance, |
+ float confidence) |
+ : result(result), |
+ relevance(relevance), |
+ confidence(confidence) { |
} |
-} // namespace |
- |
-using history::HistoryDatabase; |
+// static |
+bool HistoryContentsProvider::MatchReference::CompareRelevance( |
+ const HistoryContentsProvider::MatchReference& lhs, |
+ const HistoryContentsProvider::MatchReference& rhs) { |
+ if (lhs.relevance != rhs.relevance) |
+ return lhs.relevance > rhs.relevance; |
+ return lhs.result->last_visit() > rhs.result->last_visit(); |
+} |
HistoryContentsProvider::HistoryContentsProvider(ACProviderListener* listener, |
Profile* profile, |
@@ -187,18 +182,21 @@ void HistoryContentsProvider::ConvertResults() { |
for (std::vector<history::URLResult*>::const_reverse_iterator i = |
results_.rbegin(); i != results_.rend(); ++i) { |
history::URLResult* result = *i; |
- MatchReference ref(result, CalculateRelevance(*result)); |
+ MatchReference ref(result, CalculateRelevance(*result), |
+ CalculateConfidence(*result, results_)); |
result_refs.push_back(ref); |
} |
// Get the top matches and add them. |
size_t max_for_provider = std::min(kMaxMatches, result_refs.size()); |
std::partial_sort(result_refs.begin(), result_refs.begin() + max_for_provider, |
- result_refs.end(), &CompareMatchRelevance); |
+ result_refs.end(), &MatchReference::CompareRelevance); |
matches_.clear(); |
for (size_t i = 0; i < max_for_provider; i++) { |
- matches_.push_back(ResultToMatch(*result_refs[i].result, |
- result_refs[i].relevance)); |
+ AutocompleteMatch match(ResultToMatch(result_refs[i])); |
+ UMA_HISTOGRAM_COUNTS_100("Autocomplete.Confidence_HistoryContents", |
+ match.confidence * 100); |
+ matches_.push_back(match); |
} |
mrossetti
2011/08/09 23:40:43
Perhaps calculate sum of scores here.
|
} |
@@ -208,10 +206,11 @@ bool HistoryContentsProvider::MatchInTitle(const history::URLResult& result) { |
} |
AutocompleteMatch HistoryContentsProvider::ResultToMatch( |
- const history::URLResult& result, |
- int score) { |
- AutocompleteMatch match(this, score, true, MatchInTitle(result) ? |
- AutocompleteMatch::HISTORY_TITLE : AutocompleteMatch::HISTORY_BODY); |
+ const MatchReference& match_reference) { |
+ const history::URLResult& result = *match_reference.result; |
+ AutocompleteMatch match(this, match_reference.relevance, |
+ match_reference.confidence, true, MatchInTitle(result) ? |
+ AutocompleteMatch::HISTORY_TITLE : AutocompleteMatch::HISTORY_BODY); |
match.contents = StringForURLDisplay(result.url(), true, trim_http_); |
match.fill_into_edit = |
AutocompleteInput::FormattedStringWithEquivalentMeaning(result.url(), |
@@ -263,6 +262,39 @@ int HistoryContentsProvider::CalculateRelevance( |
(1000 + star_title_count_++) : (550 + star_contents_count_++); |
} |
+float HistoryContentsProvider::CalculateConfidence( |
+ const history::URLResult& result, |
+ const history::QueryResults& results) const { |
+ // Calculate a score of [0, 0.9] based on typed count. |
+ // Using typed count in place of visit count as: |
+ // - It's a better indicator of what the user wants to open given that they |
Peter Kasting
2011/08/09 21:52:38
Nit: To save copy+pasting, you might want to just
dominich
2011/08/10 16:10:13
I have kept these separate because the details may
|
+ // are typing in the address bar (users tend to open certain URLs by typing |
+ // and others by e.g. bookmarks, so visit_count is a good indicator of |
+ // overall interest but a bad one for specifically omnibox interest). |
+ // - Since the DB query is sorted by typed_count, the results may be |
+ // effectively a random selection as far as visit_counts are concerned |
+ // (meaning many high-visit_count-URLs may be present in one query and |
+ // absent in a similar one), leading to wild swings in confidence for the |
+ // same result across distinct queries. |
+ float numerator = result.typed_count(); |
+ float denominator = 0.0f; |
+ for (std::vector<history::URLResult*>::const_iterator it = results.begin(); |
+ it != results.end(); ++it) { |
+ denominator += (*it)->typed_count(); |
+ } |
+ // It should only be equal to 0 if the result is not in the results vector. |
+ DCHECK(denominator > 0); |
+ float score = 0.9f * (numerator / denominator); |
+ |
+ // Add 0.1 if the URL is bookmarked to get a final range of [0, 1]. |
+ if (profile_->GetBookmarkModel() && |
+ profile_->GetBookmarkModel()->IsBookmarked(result.url())) { |
+ score += 0.1f; |
+ } |
+ |
+ return score; |
+} |
+ |
void HistoryContentsProvider::QueryBookmarks(const AutocompleteInput& input) { |
BookmarkModel* bookmark_model = profile_->GetBookmarkModel(); |
if (!bookmark_model) |