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.
Comments