Episerver Find Search Statistics Click tracking search result issue

Siddharth Gupta
Member since: 2018

I am trying to implement click tracking using EPiServer Find for a CMS application. I am able to generate the statistics but the page name in the search results is showing up as page not found.

Below is a screen shot for reference: https://www.screencast.com/t/ywkYtn9L

Any info on this will be of great help to me.

#189640 Mar 21, 2018 22:26
  • Henrik Fransas
    Member since: 2007

    If you try to do the search and make sure that you are using it as a non logged in user and click on the page in the result, do you see the page?

    It might be so that the result is pages that can't be accessed by ordinary users

    #189648 Mar 22, 2018 9:15
  • Siddharth Gupta
    Member since: 2018

    @Henrik Fransas: Thank you for your reply, I actually went over your articles to implement this. 

    Another thing is that I am creating the blog article pages dynamically from an xml file. I have created a custom page for it, and also has a corresponding viewmodel for the page. Below is the sample of my code when I use search:

    Code to track the query and populate HitId and HitType properties

    var searchResults = client.Search<ArticlePage>().For(q).Select(x => new ArticleListTrackViewModel
    ArticleCategory = x.ArticleCategory,
    Created = x.Created,
    PageTitle = x.PageTitle,
    ArticleLink = x.ExternalURL,
    Author = ArticleHelper.GetAuthorName(x.Author),
    HitType = "ArticlePage"    (I am hard coding this)


    var hits = searchResults.Hits;
    foreach( var obj in hits)
     obj.Document.HitId = ArticleHelper.GetPageID(obj.Document.PageTitle); (The helper gets the PageGuid)

    model.TrackId = new TrackContext().Id;
    SearchClient.Instance.Statistics().TrackQuery(q, x =>
    x.Id = model.TrackId;
    x.Tags = ServiceLocator.Current.GetInstance<IStatisticTagsHelper>().GetTags(false);
    x.Query.Hits = searchResults.TotalMatching;
    model.NumberOfHits = searchResults.Hits.Count();
    model.Results = searchResults;

    return View(model);

    And on clicking the tracker the below mentioned action method is triggered, which in turn calls a helper function:

    Controller Code:

    public class ClickTrackingController : Controller
    public JsonResult Track(string query, string hitId, string trackId)
      Helper.TrackClick(query, hitId, trackId);

      return Json(new { msg = "Click tracked" }, JsonRequestBehavior.AllowGet);
    catch (Exception e)
    return Json(new { Success = false }, JsonRequestBehavior.AllowGet);

    Helper funtion code:

    public static void TrackClick(string query, string hitId, string trackId)
    SearchClient.Instance.Statistics().TrackHit(query, hitId, command =>
    command.Hit.Id = hitId;
    command.Id = trackId;
    command.Ip = "";
    command.Tags = ServiceLocator.Current.GetInstance<IStatisticTagsHelper>().GetTags(false); // don't get all tags
    command.Hit.Position = null;

    If you see I am hard coding the HitType and using a helper method to get the PageGuid to assign the value to HitId. I was having the same problem as you have mentioned in your article:https://world.episerver.com/forum/developer-forum/EPiServer-Search/Thread-Container/2015/5/using-projections-with-hitid-and-hittype/. But since I use a view model I am not sure if I can use the approach in the article. 

    Also, the query string parameters are as shown below:

    1. query: sample
    2. hitId: ProjectName.Models.PageTypes.ArticlePage/94cb8651-9224-4531-b60d-29dc66eeba93   (PageType / PageGuid)
    3. trackId: 1B2M2Y8AsgTpgAmY7PhCfg== (this matches the track id used in TrackQuery)

    A sample URL looks like the one mentioned below:


    #189671 Edited, Mar 22, 2018 15:21

    I had this issue recently and opened a support ticket for it.  I was told that I needed a "SearchTitle" property in my index model, and that whatever I loaded into that property would be what showed in the statistics where I was seeing "Page not found".  It worked!  Maybe you need to do the same ?

    #190731 Apr 16, 2018 15:59
  • Jens Qvist
    Member since: 2009

    Any luck with this? I have the same issue. I have added SearchTitle but it did nothing. :-/

    #194137 Jun 14, 2018 12:50
  • Jens Qvist
    Member since: 2009

     Siddharth Gupta, Your problem might be that you hard coded "ArticlePage" instead of doing this;

    HitType = SearchClient.Instance.Conventions.TypeNameConvention.GetTypeName(x),

    also you might want to try this for your HitId;

    SearchClient.Instance.Conventions.IdConvention.GetId(** the actual content (The articlePage)**)

    Finally. Make sure your class has the property SearchTitle implemented as Dave pointed out.

    #194149 Jun 14, 2018 15:45
  • Siddharth Gupta
    Member since: 2018

    Jens Qvist : Yes I got this working actually, and the problem was actually the fact that I was hard coding the HitType and the HitId as well was not implemented right. Let me know if you need a code snippet that will help you.

    #194153 Edited, Jun 14, 2018 16:32
  • Jens Qvist
    Member since: 2009

    Nah, was the hitType for me aswell. It needs to match the type of the indexed object that is clicked :-)

    #194154 Jun 14, 2018 16:33


    Any more tips available for this one? I'm using the following to create the hit ID

    string hitId = SearchClient.Instance.Conventions.IdConvention.GetId(x);
    string hitType = SearchClient.Instance.Conventions.TypeNameConvention.GetTypeName(x.GetType());
    string hitTrackId = $"{hitType}/{hitId}";

    e.g. Namespace_Pages_MyPage/_ba434590-fd1a-4d8b-a99b-d821b9e5bb8f_en-NZ

    I have a "SearchTitle$$string" populated in the EPi find index and I also have a number of click-through rates registered and bumping up the % but everything is coming through as "Page not found"

    Only thing I'm wondering is if I can expect this to work correctly in a local dev environment or do the pages need to publicly available?



    #197054 Sep 20, 2018 10:20