A critical vulnerability was discovered in React Server Components (Next.js). Our systems remain protected but we advise to update packages to newest version. Learn More

Ravindra S. Rathore
Sep 20, 2019
  3532
(7 votes)

Reindex a target site in Find (Schedule Job)

Hey Guys,

We all use Episerver Find as a search provider and it is a very handy tool for the site search. I also prefer Find over all the other search provider in Epi.

But index rebuild is very time consuming if you have multiple sites hosted in the Episerver CMS.

I am working on a project and it has around 50+ sites those are using the search functionality and whenever I want to rebuild the index for one site I have to run the pre-defined schedule job(EPiServer Find Content Indexing Job) and it takes around 1-2 hours because it rebuilt the index for all the sites.

I need a way to rebuild the indexes for the specific site so I have created a new schedule job.

using System;
using System.Text;
using System.Web;
using EPiServer.Find.Cms;
using EPiServer.Find.Helpers.Text;
using EPiServer.PlugIn;
using EPiServer.Scheduler;
using EPiServer.Web;

namespace ABC.Framework.Web.Business
{
    [ScheduledPlugIn(DisplayName = "Rebuild Targeted Site Indexes", GUID = "A71C3D81-C481-4CB5-A5B9-66BC7C0095FA")]
    public class SiteIndexScheduledJob : ScheduledJobBase
    {
        private bool _stopSignaled;

        public SiteIndexScheduledJob()
        {
            IsStoppable = true;
        }

        /// <summary>
        /// Called when a user clicks on Stop for a manually started job, or when ASP.NET shuts down.
        /// </summary>
        public override void Stop()
        {
            _stopSignaled = true;
        }

        /// <summary>
        /// Called when a scheduled job executes
        /// </summary>
        /// <returns>A status message to be stored in the database log and visible from admin mode</returns>
        public override string Execute()
        {

            if (!string.IsNullOrEmpty(SiteDefinition.Current.Name))
            {
                //Call OnStatusChanged to periodically notify progress of job for manually started jobs
                OnStatusChanged($"Starting execution of rebuild indexes for {SiteDefinition.Current.Name} site");

                var statusReport = new StringBuilder();

                // ReIndex the indexes for the sites that have * in its host configuration
                ContentIndexer.ReIndexResult reIndexResult = ContentIndexer.Instance.ReIndex(
                    status =>
                    {
                        if (status.IsError)
                        {
                            string errorMessage = status.Message.StripHtml();
                            if (errorMessage.Length > 0)
                                statusReport.Append($"{errorMessage}");
                        }

                        OnStatusChanged(
                            $"Indexing job [{(SiteDefinition.Current.Name)}] [content]: {status.Message.StripHtml()}");
                    },
                    () => _stopSignaled);
            }
            else
            {
                return "Job is cancelled. Please add a host entry with * in site, which you rebuild the indexes";
            }


            //For long running jobs periodically check if stop is signaled and if so stop execution
            if (_stopSignaled)
            {
                return "Stop of job was called";
            }


            return $"Index rebuild successful for {SiteDefinition.Current.Name}";
        }
    }
}

It basically rebuilds the indexes for the current site but as you know that if you try to access the "SiteDefinition.Current" in the schedule job it will not return the site, so to overcome this thing you need to apply a wild card character * in the site. Once you applied the wild card character you will get that site as a current site. You can read more about it HERE

So add a wild card character on the site on which you want to rebuild the indexes. Please refer below screenshot for your reference.

Once you are done with this. Please go to Admin->Admin and run the new schedule job "Rebuild Targeted Site Indexes". You will see that it will start the indexing for the wild card character site.

I hope it helps.

Thanks

Ravindra

Sep 20, 2019

Comments

Ha Bui
Ha Bui Sep 20, 2019 04:25 PM

Nice!

Could better if we have a Admin Tool that will show multiple sites for selection.

When click reindex then trigger job for those sites only!

// Ha Bui

Son Do
Son Do Sep 22, 2019 04:48 AM

Nice write up (Y)

Ravindra S. Rathore
Ravindra S. Rathore Sep 22, 2019 03:17 PM

Thanks, @Son Do.

@Ha Bui - Created an Admin Tool for this - https://world.episerver.com/blogs/ravindra-s--rathore/dates/2019/9/reindex-a-target-site-in-episerver-find--admin-tool/

Thanks

Ravindra S. Rathore

Ha Bui
Ha Bui Sep 23, 2019 05:09 AM

Good work @Ravindra!

Please login to comment.
Latest blogs
Looking back at Optimizely in 2025

Explore Optimizely's architectural shift in 2025, which removed coordination cost through a unified execution loop. Learn how agentic Opal AI and...

Andy Blyth | Dec 17, 2025 |

Cleaning Up Content Graph Webhooks in PaaS CMS: Scheduled Job

The Problem Bit of a niche issue, but we are building a headless solution where the presentation layer is hosted on Netlify, when in a regular...

Minesh Shah (Netcel) | Dec 17, 2025

A day in the life of an Optimizely OMVP - OptiGraphExtensions v2.0: Enhanced Search Control with Language Support and Synonym Slots

Supercharge your Optimizely Graph search experience with powerful new features for multilingual sites and fine-grained search tuning. As search...

Graham Carr | Dec 16, 2025

A day in the life of an Optimizely OMVP - Optimizely Opal: Specialized Agents, Workflows, and Tools Explained

The AI landscape in digital experience platforms has shifted dramatically. At Opticon 2025, Optimizely unveiled the next evolution of Optimizely Op...

Graham Carr | Dec 16, 2025

Optimizely CMS - Learning by Doing: EP09 - Create Hero, Breadcrumb's and Integrate SEO : Demo

  Episode 9  is Live!! The latest installment of my  Learning by Doing: Build Series  on  Optimizely Episode 9 CMS 12  is now available on YouTube!...

Ratish | Dec 15, 2025 |

Building simple Opal tools for product search and content creation

Optimizely Opal tools make it easy for AI agents to call your APIs – in this post we’ll build a small ASP.NET host that exposes two of them: one fo...

Pär Wissmark | Dec 13, 2025 |