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é):
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 { } } }