Take the community feedback survey now.

Rajveer Singh
Jul 1, 2025
  360
(0 votes)

Boosting by published date with Relevance

Goal: To ensure that the latest published or last updated content is ranked higher in your search results, you can modify your query to include a boost based on recency. This typically involves boosting content based on a date field such as PublishedDate or LastUpdated.

Here’s how you can update your query to prioritize recent content while still considering relevance:

var result = query.ApplyBestBets()
    .BoostMatching(x => ((IContent)x).SearchTitle().MatchCaseInsensitive(contentFilter.SearchQuery), 1.5)
    .OrderByDescending(x => ((IContent)x).LastUpdated) // Boost by recency
    .Take(pageSize)
    .Skip((pageNo - 1) * pageSize)
    .StaticallyCacheFor(TimeSpan.FromSeconds(CacheSpan))
    .GetResult(hitSpec);

Explanation:

  • OrderByDescending(x => ((IContent)x).LastUpdated) ensures that the most recently updated content appears first.
  • If you want to balance relevance and recency, you might consider a custom scoring function or a composite boost that combines both.

 

------------

 

Also, we can implementing a more advanced scoring strategy that balances relevance and freshness as below:

To implement a balanced scoring strategy that considers both relevance and recency, you can use a custom boost function. This approach allows you to:

  • Boost content that matches the search query (relevance).
  • Boost content that is recently published or updated (recency).
  • Combine both into a composite score.

Here’s how you can update your query using a custom boost expression:

var result = query.ApplyBestBets()
    .BoostMatching(x => ((IContent)x).SearchTitle().MatchCaseInsensitive(contentFilter.SearchQuery), 1.5)
    .OrderByDescending(x => 
        ((IContent)x).SearchTitle().MatchCaseInsensitive(contentFilter.SearchQuery) ? 1 : 0 + 
        GetRecencyScore(((IContent)x).LastUpdated)
    )
    .Take(pageSize)
    .Skip((pageNo - 1) * pageSize)
    .StaticallyCacheFor(TimeSpan.FromSeconds(CacheSpan))
    .GetResult(hitSpec);

You’ll need to define GetRecencyScore like this:

private double GetRecencyScore(DateTime lastUpdated)
{
    var daysOld = (DateTime.UtcNow - lastUpdated).TotalDays;

    // Example scoring: newer content gets higher score
    if (daysOld <= 1) return 1.0;
    if (daysOld <= 7) return 0.8;
    if (daysOld <= 30) return 0.5;
    if (daysOld <= 90) return 0.3;
    return 0.1;
}

Why this works:

  • It gives a higher score to recent content, but still considers query match.
  • You can tune the weights in GetRecencyScore to fit your needs.




Jul 01, 2025

Comments

Please login to comment.
Latest blogs
Building Faster Feedback Loops with Opal: Two Hackathon Projects

Two Opal Hackathon projects explored how to bridge data and action. Using the Optimizely.Opal.Tools SDK, we extended Opal with new tools, showing h...

Andy Blyth | Sep 3, 2025 |

Custom Deepl Glossary Translation in Optimizely CMS

Introduction in this post, I have created a custom DeepL glossary translation for specific words. For example, when translating from English to...

Deepmala S | Sep 3, 2025

Showing Unpublished Block Status in Optimizely CMS 12 ContentArea

Introduction One of the most common editor complaints in Optimizely CMS is that it’s not obvious when a block inside a ContentArea has unpublished...

Adnan Zameer | Sep 2, 2025 |

How to Show Unpublished Blocks in Page Preview (Optimizely CMS 12)

Introduction In this post, we’ll look at why Draft Blocks don’t show in Page Preview by default, and I'll show you a clean, drop-in solution to fix...

Adnan Zameer | Sep 1, 2025 |