K Khan
OMVPPaaS CMS Administrator Certification
Sep 15, 2015
visibility 5772
star star star star star
(5 votes)

EPiServer Find performance review

EPiServer Find is a product for free text search as well as content retrieval. It offers an intuitive API for indexing and querying objects. It allows to query data using our own domain model as it recognizes the fact that we know best about our data. It offers a better experience to users, shorter development cycles and cost efficiency.

EPiserver Find Search performance and capabilities are proven but how developers are using those can affect the site performance. If developers are writing queries that involves round trips can effect the performance of page.

//Not optimal
foreach (var article in Articles)
{
      var results = SearchClient.Instance.Search<ArticlePage>()
                                                        .For(article).GetResult();
}
//Optimal
results = service.MultiSearch<ArticlePage>()
                            .Search<Article>(x => x.For("Article1").InField(y => y.Title))
                            .Search<Article>(x => x.For("Article2").InField(y => y.Title))
                            .GetResult();

Indexing data to EPiserver find is a time consuming task and needs consideration when implementing. We need to consider batch size and objects also. EPiserver Find indexing like Bulks.

// Not optimal 
List<MyObject> objects = GetObjectsFromSomeWhere();
foreach (var o in objects)
{
    client.Index(o);
}
// Optimal 
List<MyObject> objects = GetObjectsFromSomeWhere();
client.Index(objects);

By doing this, we will significantly reduce the number of calls sent to the Find index, thus increase the general performance and decrease time taken to index. 

While indexing we have to consider object sizes also. If object size are too large we have to reduce the no of items to go in one index pack. There are few other factors that developers must consider while indexing the data are as following

  • Dont Index the unwanted objects e.g. Images/Videos
    ContentIndexer.Instance.Conventions.ForInstancesOf<ImageData>().ShouldIndex(x => false);
  • Implement the BatchSize for indexing so it can be adjusted to improve indexing time.
    // set the ContentBatchSize to confingured value 
    ContentIndexer.Instance.ContentBatchSize = contentBatchSize;
    
    // set the MediaBatchSize to confingured value
    ContentIndexer.Instance.MediaBatchSize = mediaBatchSize;
    

It will be helpful, if you could share performance issue that you have faced and their fixes also in comments. 

Sep 15, 2015

Comments

Henrik Fransas
Henrik Fransas Sep 15, 2015 12:29 PM

Great post!

Also remenber to cache the the result if you are using GetResult (GetContentResult do it automaticly) like this:

var result = client.Search()
    .StaticallyCacheFor(TimeSpan.FromMinutes(5))
    .GetResult();

And also a great way to improve performance is to use projections instead of returning the whole object, if you for example only are interested in title and author name you can do like this to project it into a anonymous type:

var result = client.Search()
    .Select(x => new { 
        x.Title, 
        AuthorName = x.Author.Name })
    .GetResult();

Or like this to project it into a type'ed object:

var result = client.Search()
    .Select(x => new SearchResult { 
        Title = x.Title.AsCropped(50), 
        Author = x.Author.Name})
    .GetResult();

K Khan
K Khan Sep 15, 2015 02:47 PM

great addition :)

Per Magne Skuseth
Per Magne Skuseth Sep 25, 2015 09:14 AM

Thanks for sharing!
Regarding bulk indexing, check out this blog post for a handy snippet

error Please login to comment.
Latest blogs
Why your GeoPoint never reaches Optimizely Graph, and how to fix it

Geo search lets Optimizely Graph match and rank content against geographic coordinates, so applications can deliver location-aware experiences such...

K Khan | Nov 11, 2026

Mark goes desktop: what's new in Optimizely Agent Platform, November 2026

Optimizely's November release for Mark, the Optimizely Agent Platform, is one of the most significant updates since the platform launched. Two...

Scott Reed | Nov 11, 2026

Upgrading Optimizely CMS 13 from .NET 10 to .NET 11

How to upgrade Optimizely CMS 13 to .NET 11, including a workaround for edit mode and an Azure gotcha.

Tomas Hensrud Gulla | Nov 11, 2026 |

Making Built-in CMS Categories Queryable in Optimizely Graph (CMS 13 PaaS)

With Optimizely CMS 13 PaaS, Optimizely Graph replaces Search & Navigation as the content query engine. However, if your existing CMS solution reli...

Mardy | Nov 10, 2026