Search Crawler na publishing portálu indexuje vždy kompletní stránku, tak jak dostane HTML, tak ho uloží do své databáze. To je ovšem problém, neboť následně při vyhledávání vyhledává texty i v navigaci webu nebo hlavičce a patičce. Tyto elementy jsou ale ve většině případů pro všechny stránky na portále stejné, uživatel tak dostává nerelevantní výsledky (navíc stále stejné):

image

Neexistuje možnost, jak automaticky donutit Search Server, aby toto chování změnil a například ignoroval stále stejné elementy na stránce, případně jinak pomocí tagu vynechával zvolené oblasti v master page.

Udělal jsem si proto malého pomocníka, který se vloží do masterpage v podobě:

<DevIT:SearchCrawlTrimmedControl runat="server" SearchAccount="MySearchAccount">

<!-- zde vlozte menu, header, footer... vse co chcete skryt pred indexerem –>

</DevIT:SearchCrawlTrimmedControl>

Kde uvnitř ovládacího prvku SearchCrawlTrimmedControl jsou všechny elementy, které chci skrýt před indexerem obsahu. Tato třída pak následně podle přistupujícího účtu skryje nebo zobrazí vybrané elementy.

/// <summary>
/// Ovladaci prvek pro skyti vsech nepotrebnych veci v masterpage pri indexovani - aby se indexoval pouze samotny obsah stranky
/// <DevIT:SearchCrawlTrimmedControl runat="server"> 
/// <!-- zde vlozte menu, header, footer... vse co chcete skryt pred indexerem -->
/// </DevIT:SearchCrawlTrimmedControl>
/// </summary>
public class SearchCrawlTrimmedControl : Control
{
    public string SearchAccount
    {
        get {
            string ret = ViewState["SearchAccount"] as string;
            if (string.IsNullOrEmpty(ret))
                return "spsearch";
            return ret;
        }
        set { ViewState["SearchAccount"] = value; }
    }

    protected override void Render(HtmlTextWriter writer)
    {
        bool render = true;
        SPUser cu = SPContext.Current.Web.CurrentUser;
        if (cu != null)
        {
            if (cu.LoginName.ToLower().EndsWith(SearchAccount))
            {
                render = false;
            }
        }
        if (Context.Request != null && Context.Request.UserAgent != null &&
            Context.Request.UserAgent.ToLower().Contains("robot"))
        {
            render = false;
        }
        if (render)
        {
            base.Render(writer);
        }
        else
        {
        }
    }
}