| Index: chrome/browser/history/url_index_private_data.cc
|
| ===================================================================
|
| --- chrome/browser/history/url_index_private_data.cc (revision 122007)
|
| +++ chrome/browser/history/url_index_private_data.cc (working copy)
|
| @@ -43,11 +43,16 @@
|
| typedef imui::InMemoryURLIndexCacheItem_HistoryInfoMapItem_HistoryInfoMapEntry
|
| HistoryInfoMapEntry;
|
|
|
| +// The maximum score any candidate result can achieve.
|
| +const int kMaxTotalScore = 1425;
|
| +
|
| // Score ranges used to get a 'base' score for each of the scoring factors
|
| // (such as recency of last visit, times visited, times the URL was typed,
|
| // and the quality of the string match). There is a matching value range for
|
| -// each of these scores for each factor.
|
| -const int kScoreRank[] = { 1425, 1200, 900, 400 };
|
| +// each of these scores for each factor. Note that the top score is greater
|
| +// than |kMaxTotalScore|. The score for each candidate will be capped in the
|
| +// final calculation.
|
| +const int kScoreRank[] = { 1450, 1200, 900, 400 };
|
|
|
| // SearchTermCacheItem ---------------------------------------------------------
|
|
|
| @@ -562,39 +567,34 @@
|
|
|
| // Determine scoring factors for the recency of visit, visit count and typed
|
| // count attributes of the URLRow.
|
| - const int kDaysAgoLevel[] = { 0, 10, 20, 30 };
|
| + const int kDaysAgoLevel[] = { 1, 10, 20, 30 };
|
| int days_ago_value = ScoreForValue((base::Time::Now() -
|
| row.last_visit()).InDays(), kDaysAgoLevel);
|
| const int kVisitCountLevel[] = { 30, 10, 5, 3 };
|
| int visit_count_value = ScoreForValue(row.visit_count(), kVisitCountLevel);
|
| - const int kTypedCountLevel[] = { 10, 5, 3, 1 };
|
| + const int kTypedCountLevel[] = { 20, 10, 3, 1 };
|
| int typed_count_value = ScoreForValue(row.typed_count(), kTypedCountLevel);
|
|
|
| // The final raw score is calculated by:
|
| - // - accumulating each contributing factor, some of which are added more
|
| - // than once giving them more 'influence' on the final score (currently,
|
| - // visit_count_value is added twice and typed_count_value three times)
|
| - // - dropping the lowest scores (|kInsignificantFactors|)
|
| - // - dividing by the remaining significant factors
|
| - // This approach allows emphasis on more relevant factors while reducing the
|
| - // inordinate impact of low scoring factors.
|
| - int factor[] = {term_score, days_ago_value, visit_count_value,
|
| - visit_count_value, typed_count_value, typed_count_value,
|
| - typed_count_value};
|
| - const int kInsignificantFactors = 2;
|
| - const int kSignificantFactors = arraysize(factor) - kInsignificantFactors;
|
| - std::partial_sort(factor, factor + kSignificantFactors,
|
| - factor + arraysize(factor), std::greater<int>());
|
| - for (int i = 0; i < kSignificantFactors; ++i)
|
| - match.raw_score += factor[i];
|
| - match.raw_score /= kSignificantFactors;
|
| + // - multiplying each factor by a 'relevance'
|
| + // - calculating the average.
|
| + const int kTermScoreRelevance = 1;
|
| + const int kDaysAgoRelevance = 2;
|
| + const int kVisitCountRelevance = 3;
|
| + const int kTypedCountRelevance = 4;
|
| + match.raw_score = term_score * kTermScoreRelevance +
|
| + days_ago_value * kDaysAgoRelevance +
|
| + visit_count_value * kVisitCountRelevance +
|
| + typed_count_value * kTypedCountRelevance;
|
| + match.raw_score /= (kTermScoreRelevance + kDaysAgoRelevance +
|
| + kVisitCountRelevance + kTypedCountRelevance);
|
| + match.raw_score = std::min(kMaxTotalScore, match.raw_score);
|
|
|
| return match;
|
| }
|
|
|
| int URLIndexPrivateData::ScoreComponentForMatches(const TermMatches& matches,
|
| size_t max_length) {
|
| - // TODO(mrossetti): This is good enough for now but must be fine-tuned.
|
| if (matches.empty())
|
| return 0;
|
|
|
| @@ -602,7 +602,7 @@
|
| // in the same order in the match. Start with kOrderMaxValue points divided
|
| // equally among (number of terms - 1); then discount each of those terms that
|
| // is out-of-order in the match.
|
| - const int kOrderMaxValue = 250;
|
| + const int kOrderMaxValue = 1000;
|
| int order_value = kOrderMaxValue;
|
| if (matches.size() > 1) {
|
| int max_possible_out_of_order = matches.size() - 1;
|
| @@ -617,11 +617,11 @@
|
|
|
| // Score component for how early in the match string the first search term
|
| // appears. Start with kStartMaxValue points and discount by
|
| - // 1/kMaxSignificantStart points for each character later than the first at
|
| - // which the term begins. No points are earned if the start of the match
|
| - // occurs at or after kMaxSignificantStart.
|
| - const size_t kMaxSignificantStart = 20;
|
| - const int kStartMaxValue = 250;
|
| + // kStartMaxValue/kMaxSignificantStart points for each character later than
|
| + // the first at which the term begins. No points are earned if the start of
|
| + // the match occurs at or after kMaxSignificantStart.
|
| + const size_t kMaxSignificantStart = 50;
|
| + const int kStartMaxValue = 1000;
|
| int start_value = (kMaxSignificantStart -
|
| std::min(kMaxSignificantStart, matches[0].offset)) * kStartMaxValue /
|
| kMaxSignificantStart;
|
| @@ -634,15 +634,21 @@
|
| const size_t kMaxSignificantLength = 50;
|
| size_t max_significant_length =
|
| std::min(max_length, std::max(term_length_total, kMaxSignificantLength));
|
| - const int kCompleteMaxValue = 500;
|
| + const int kCompleteMaxValue = 1000;
|
| int complete_value =
|
| term_length_total * kCompleteMaxValue / max_significant_length;
|
|
|
| - int raw_score = order_value + start_value + complete_value;
|
| - const int kTermScoreLevel[] = { 1000, 650, 500, 200 };
|
| + const int kOrderRelevance = 1;
|
| + const int kStartRelevance = 6;
|
| + const int kCompleteRelevance = 3;
|
| + int raw_score = order_value * kOrderRelevance +
|
| + start_value * kStartRelevance +
|
| + complete_value * kCompleteRelevance;
|
| + raw_score /= (kOrderRelevance + kStartRelevance + kCompleteRelevance);
|
|
|
| - // Scale the sum of the three components above into a single score component
|
| - // on the same scale as that used in ScoredMatchForURL().
|
| + // Scale the raw score into a single score component in the same manner as
|
| + // used in ScoredMatchForURL().
|
| + const int kTermScoreLevel[] = { 1000, 750, 500, 200 };
|
| return ScoreForValue(raw_score, kTermScoreLevel);
|
| }
|
|
|
|
|