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