Pavel Novotný

.NET Framework, SharePoint, Dynamics CRM, RC Helicopters, Honda VFR CrossRunner

SharePoint Search Crawler indexuje na publishing portálu kompletně celou stránku–jak indexovat pouze obsah bez navigace a ostatních rušivých elementů

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 
        { 
        } 
    } 
}

Přidat komentář

Loading