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ě:

[more]

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

An error occurred during the processing of /_catalogs/masterpage/MyCustom.master. Code blocks are not allowed in this file.

Vložení server side kódu přímo do masterpage nebo do stránek předlohy je nutné povolit vložením následující direktivy do souboru web.config:

[more]

 <SharePoint>
   <SafeMode MaxControls=“200″ CallStack=“false“ DirectFileDependencies=“10″ TotalFileDependencies=“50″ AllowPageLevelTrace=“false“>
     <PageParserPaths>
           
<PageParserPath VirtualPath=“~/*“ CompilationMode=“Always“ AllowServerSideScript=“true“ />
     </PageParserPaths>
   </SafeMode>

Kde VirtualPath může být cesta do knihovny stránek předlohy, nebo v mém případě je možné tuto akci povolit pro celou webovou aplikaci.