<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Codality &#187; Faceted Navigation</title>
	<atom:link href="http://blog.najmanowicz.com/category/software-development/episerver/faceted-navigation/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.najmanowicz.com</link>
	<description>Code and Effect - solving problem with just enough amount of code - by Adam Najmanowicz</description>
	<lastBuildDate>Mon, 08 Feb 2010 12:01:38 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>CMS UX &#8211; give the content some thought!</title>
		<link>http://blog.najmanowicz.com/2010/02/08/cms-ux-give-the-content-some-thought/</link>
		<comments>http://blog.najmanowicz.com/2010/02/08/cms-ux-give-the-content-some-thought/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 12:01:38 +0000</pubDate>
		<dc:creator>Adam Najmanowicz</dc:creator>
				<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[CMS UX]]></category>
		<category><![CDATA[EPiServer]]></category>
		<category><![CDATA[Faceted Navigation]]></category>
		<category><![CDATA[Web applications]]></category>

		<guid isPermaLink="false">http://blog.najmanowicz.com/2010/02/08/cms-ux-give-the-content-some-thought/</guid>
		<description><![CDATA[One of the many things we debate constantly at Cognifide is how to improve the user experience. How to make editor’s life easier, how to simplify the common everyday tasks, what can be automated, and simply how to make our customer smile a little when they use our projects.
For that to work, apart from the [...]]]></description>
			<content:encoded><![CDATA[<p>One of the many things we debate constantly at Cognifide is how to improve the user experience. How to make editor’s life easier, how to simplify the common everyday tasks, what can be automated, and simply how to make our customer smile a little when they use our projects.</p>
<p>For that to work, apart from the overall big blocks to be in place and working seamlessly (which is the absolute minimum required) – you need to be VERY attentive to details. </p>
<p>What happens when user enters a place in the system where they are not usually required to work, are they properly guided? What do they see if they click on a little link somewhere in the corner? Does every image has an Alt text attached to it? Do your buttons have tooltips? Do the users have alternate views on all content? Do the system communicates abnormal states in a descriptive way and guides the user towards the solution? Is the UI logically laid out? Did you REALLY think what property should go on which tab? Have you setup the property names in a way that they make sense to non programmer? Do they have descriptions?</p>
<p>Part of the job we do is help sometimes troubled EPiServer customers get their solution built elsewhere or in-house to work, and I seem to be noticing some patterns which we have addressed in Cognifide as being bad practices. Many of those stem from the lack of research of the content served being done in the discovery phase. </p>
<h2>Discovery phase? What’s that?</h2>
<p>It seems that a great deal of projects does not seem to be well thought out in many aspects. When you look at the solution, It feels like a developer just got some templates and ran with them. Once the front end matches what the html templates outline, the solution is pushed to production and forgotten by the design/development agency and the poor customer is struggling with it for years trying to improve the ever degrading performance and fighting the CMS UI that’s been thrown together in a rush. Possibly aggravating in the process and rebuilding it again and again.</p>
<p>You need to realize that once your site goes to production, the trouble begins for your customer, not ends.</p>
<h2>Understand your content, please</h2>
<p>A very basic tendency for a lot of them is storing all the content of one type under a single tree node. or a very basic hierarchy. But:</p>
<ul>
<li>What is the volume of content in the start? </li>
<li>Have you talked to the client about the maintenance of the content? </li>
<li>How do they plan to store older content?
<ul>
<li>Are they archiving it? </li>
<li>Do they plan to serve it to general while archived? </li>
<li>Is the old content actively browsed on the CMS side? </li>
</ul>
</li>
<li>What is the volume increase over time? </li>
<li>What is the profile of the content? Is it a catalogue? Chronological news library? </li>
<li>Is there a taxonomy in place? </li>
<li>How often and which content is being modified? </li>
</ul>
<p>EPiServer shows pages in a tree, and while we have observed the CMS performance improving over time there are some basic scenarios that the hierarchy structure will never be able to deal with efficiently if not well thought out.</p>
<p>So your potential edge case scenarios might be that the customer has:</p>
<ol>
<li>10 000 articles that need to be migrated for the site to go live, but they only plan to add 2-3 a month, </li>
<li>They might be starting fresh but they plan to add 20 to 30 articles a day! </li>
</ol>
<p>How do you deal with those?</p>
<p>Obviously the worst thing you can do is to put them all under the “Articles” node. The customer will be frustrated to no end! Both you and the CMS reputation gets damaged while they try to do any basic thing in the CMS.</p>
<p>In the first case you need to work with the client to dissolve them into the hierarchy that’s granular enough to leave you with the 20-50 articles per node tops. Dividing it into 10 categories of roughly 1000 items won’t do! If the page names are meaningful, you may attempt to create a structure based on the first and second letter of the articles. This works best for directories of people or places.</p>
<p>The second case is probably going to happen to you when you will be working with any kind of news site, be that intranet of sorts or a news agency, TV portal or an information broker. In which case, it seems to be making the most sense to put the content into a chronological structure. Have a node for each year, month (and day if needed) there is an article. </p>
<h2>AUTOMATE! </h2>
<p>When a user writes an article that is supposed to fit into your content plan, move it into the proper node automatically. In the first case, move it to the proper category or based on the page title move it around to the proper place in the catalogue. In the chronological plan, move it to the day or month node upon creation. If a new node needs to be created for it – that’s your responsibility to do it. Organize the content for the user or you will be in a world of pain sooner than you expect!</p>
<p>Those tasks are easily automated by hooking into the page save and create events. Your customer will love you for it.</p>
<p>Naturally you don’t necessarily have to have a single plan on a given site. A site can have both branches with news-like plan and directory-like sub trees.</p>
<p>The base line is – you need to plan it ahead, and you need to learn about the content profile.</p>
<h2>Distinction <strong>with</strong> a difference</h2>
<p>You need to realize the distinction between the content and the presentation of it. Don’t try to cram the content into the browsing structure. Separation of concerns should not be limited to code organization. Separate concerns in the content structure as well.</p>
<p>Have the user trip designed around the best SEO practices. The hub pages should make sense from the visitor’s perspective. DON’T try to put your articles under it just because the hub page browses them. this may work for a little tiny sites but then again, those are not the sites that you will run into troubles because it basically means your customer is barely ever touching them.</p>
<p>Have your content stored in a separate branch and reach out for it with a tag set that is related to the hub page. </p>
<h2>Build a logical taxonomy and stick to it!</h2>
<p>That basically means – treat your content equally no matter where it’s stored – preferably having it tagged with a high performance framework like the <a href="http://blog.najmanowicz.com/category/software-development/episerver/faceted-navigation/">Faceted Navigation Framework</a> published by Cognifide some time ago or make it <a href="http://incubator.apache.org/lucene.net/">Lucene.Net</a> based. You can try to use the EPiServer built in categories. We have had limited success with it and the performance of FindPagesWithCriteria (which we have effectively banned from our arsenal) but I was told the performance in that front have improved greatly in the latest EPiServer CMS release.</p>
<p>Regardless – don’t rely on the page hierarchy structure to select the content, it doesn’t matter where it is, the metadata is what should be driving the content stream. You can hand pick your navigation links, fine, but article lists, news, announcements, events, treat it as a single content stream. Use a taxonomy to divide it into categories and you will be much happier in the long run as you will gain much more flexibility to reorganize the structure and move the content around when its profile changes later.</p>
<p>Using the EPiServer CMS for nearly 4 years now, those are the basic principles we have come to establish. </p>
<p>I wonder what are your practices? Where do you think our practices do or do not fit your design philosophy? Is there anything we could do better? Do you have practices regarding content planning? How do you analyze the content to make the best plan for it?</p>
<img src="http://blog.najmanowicz.com/?ak_action=api_record_view&id=168&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.najmanowicz.com/2010/02/08/cms-ux-give-the-content-some-thought/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Episerver&#8217;s brand new blogger</title>
		<link>http://blog.najmanowicz.com/2008/03/04/episervers-brand-new-blogger/</link>
		<comments>http://blog.najmanowicz.com/2008/03/04/episervers-brand-new-blogger/#comments</comments>
		<pubDate>Tue, 04 Mar 2008 14:56:28 +0000</pubDate>
		<dc:creator>Adam Najmanowicz</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Blogging]]></category>
		<category><![CDATA[EPiCode]]></category>
		<category><![CDATA[EPiServer]]></category>
		<category><![CDATA[Faceted Navigation]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://blog.najmanowicz.com/2008/03/04/episervers-brand-new-blogger/</guid>
		<description><![CDATA[I&#8217;m really glad to notice that Marek is getting into blogging about EPiServer. Marek is a really bright developer and a colleague at Cognifide with a number of successful EPiServer projects in his portfolio, we&#8217;ve worked together on Faceted Navigation (he&#8217;s the brain behind all the nifty editors in it) that I&#8217;m working on open [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m really glad to notice that <a href="http://marekblotny.blogspot.com/">Marek</a> is getting into blogging about <a href="http://www.episerver.com/">EPiServer</a>. Marek is a really bright developer and a colleague at <a href="http://www.cognifide.com/">Cognifide</a> with a number of successful EPiServer projects in his portfolio, we&#8217;ve worked together on Faceted Navigation (he&#8217;s the brain behind all the nifty editors in it) that I&#8217;m working on open sourcing of currently, and on the <a href="http://www.setantasports.com/">Setanta Sports Portal</a> and the <a href="http://www.setanta.com/">Setanta corporate</a> site projects. Now he&#8217;s out in the wild writing about it. Go ahead and read his analysis on the <a href="http://marekblotny.blogspot.com/2008/03/episerver-5-vs-episerver-461-part-i.html">performance of Episerver 4.x versus CMS 5</a>. It appears that the CMS is getting&#8230; nah&#8230; I won&#8217;t spoil it for you&#8230; Read all about it on <a href="http://marekblotny.blogspot.com/">Marek&#8217;s brand new blog</a>!</p>
<img src="http://blog.najmanowicz.com/?ak_action=api_record_view&id=92&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.najmanowicz.com/2008/03/04/episervers-brand-new-blogger/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Faceted Service Structure</title>
		<link>http://blog.najmanowicz.com/2008/01/24/faceted-service-structure/</link>
		<comments>http://blog.najmanowicz.com/2008/01/24/faceted-service-structure/#comments</comments>
		<pubDate>Thu, 24 Jan 2008 16:18:33 +0000</pubDate>
		<dc:creator>Adam Najmanowicz</dc:creator>
				<category><![CDATA[.Net Framework]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[EPiCode]]></category>
		<category><![CDATA[EPiServer]]></category>
		<category><![CDATA[Faceted Navigation]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Web applications]]></category>

		<guid isPermaLink="false">http://blog.najmanowicz.com/2008/01/24/faceted-service-structure/</guid>
		<description><![CDATA[This article is a part of the series describing the faceted navigation system for EPiServer that we have developed in Cognifide and that&#8217;s already proven to be a robust solution for delivering tagged content a heavy traffic site. The engine will be released shortly as an open source project.
So how is the faceted engine structured?

 [...]]]></description>
			<content:encoded><![CDATA[<p>This article is a part of the <a href="http://blog.najmanowicz.com/category/episerver/faceted-navigation/">series describing the faceted navigation system for EPiServer</a> that we have developed in <a href="http://www.cognifide.com/">Cognifide</a> and that&#8217;s already proven to be a robust solution for delivering tagged content a heavy traffic site. The engine will be released shortly as an open source project.<br />
<h2>So how is the faceted engine structured?</h2>
</p>
<p align="center"><a href="http://blog.najmanowicz.com/wp-content/uploads/2008/01/facetednavigationschema.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="195" alt="FacetedNavigationSchema" src="http://blog.najmanowicz.com/wp-content/uploads/2008/01/facetednavigationschema-thumb.png" width="244" border="0"/></a> </p>
<p><span id="more-91"></span></p>
<h2>Content provider</h2>
<p>As you can see the driving force behind the engine is the Facet Tagged Content Provider. If you know EPiServer, the basic functionality of the module is roughly an an equivalent of find page with criteria for categories, which allows for searching pages tagged with facets with exclusion of some other facets and tagged some optional data, the module however is paging and and allows you to plug a feedback event handler so that your controls can accept or deny a story before they are sent to is and take part in the paging. The stories are provided to you in reverse order of publishing so you always get the latest stories first, (pretty much what any blog and any news site wants).</p>
<p>Another function of the content provider is assertion of story uniqueness on the page. This is actually a pretty cool mechanism that deserves closer attention.</p>
<p>Let&#8217;s imagine a page having a control with &#8220;main story&#8221; that is pre-selected by an editor, and then some &#8220;featured stories&#8221; also pre-selected, then there is a control with &#8220;latest news concerning facet A&#8221; and a &#8220;latest news concerning facet B&#8221;. The problem with this scenario is that if a story was pre-selected for the &#8220;main story&#8221; and perhaps then someone added it to &#8220;featured stories&#8221;, and the story actually is tagged by facet A and facet B &#8211; in a traditional search you would normally get it in all of the controls&#8230; not cool! </p>
<p>The solution that we&#8217;ve come up with is based on a free market rules. And the procedure is as follows:</p>
<ol>
<li>The request starts and the engine opens a bidding for articles.  </li>
<li>All the controls request their interest in stories by either providing the engine with pre-selected stories they would like to display or asking it to provide the freshest content based on the facets the content is tagged with. They also provide it with their value (priority). And a callback for the engine to provide them with the stories.  </li>
<li>The acceptance phase ends and the engine distributes the stories looking from the highest value controls down the list in the following way
<ul>
<li>when the control provide the list of articles if so check for each article if it has not been taken yet, and otherwise feed it back to the control  </li>
<li>otherwise if the control provided it with the facets it&#8217;s &#8220;interested in&#8221; it asks the tagged content store for articles tagged with this context and feeds them to the control if they have not been otherwise provided to another control with higher priority, until it reaches the number requested by the control. (this way of providing articles also allows for paging).</li>
</ul>
</li>
<li>Upon satisfying all the controls the bidding is closed and all articles become available again.</li>
</ol>
<h2>Content Accelerator</h2>
<p>Content accelerator is a caching module that we have made mandatory that all of our EPiServer calls must pass through. The engine turns the pages into objects with a well defined and hard typed objects rather than a-bag-of-strings-and-the-likes your usual PageData is.</p>
<p>This makes it much more efficient for us to cache only the important data contained in any given page and only the data that we use frequently, e.g. page name and page URL that are used by URL provider and that are likely to be called multiple times within any given user request. This has been been implemented to compensate for the slowness of GetPage calls.</p>
<p>For that to work effectively we always tread content accelerator as a proxy for GetPage &#8211; which allows us to filter any expired or not yet published pages faster and refresh the content and accessibility for everyone, any time any given content is refreshed.</p>
<p>The For this concept to work &#8211; any page type that is going to be used in it has to have its own class added to it with the properties you will usually access (this however should be done with caution, for example you can cache article intro, but caching a potentially big article is a bad idea &#8211; also a full article text is very unlikely to be displayed on a high traffic page so caching all of your article full texts will not offset for a potential quick running out of memory).</p>
<p>Also the content cache is written using generics in a way that allows you to specify a multiple classes for any page types &#8211; the class consuming the cache defines how it wants to treat the content and access it. The different cache classes will then be chain linked and refreshed.</p>
<p>The content expires on an arbitrary set time (1 minute in our case but you can specify any other period), but we&#8217;ve also written a web service allowing for expiring a page-cache-item whenever it is changed on any of servers in a multiserver scenario. This for this to work &#8211; you have to plug into the global EPiServer event handlers. Which I&#8217;ll describe later.</p>
<p>The accelerator is used extensively by the faceted engine, but it can also be used directly and is completely independent of the rest of the faceted engine.</p>
<h2>Facet Context Provider</h2>
<p>This provides the control with ewasy facility to retrieve the facets with which the request was performed.</p>
<h2>Facet URL Provider</h2>
<p>This service allows you to construct URLs based on a facet context &#8211; with automatic determination of a preferred visualisation (hub page). Naturally you can still force the provider to format the URL for a pre-determined page. The effect will be a request that can later be succesfully parsed by the Context Provider once that URL is executed on the server.</p>
<h2>Auto Tagging Module</h2>
<p>This block which originally was a separate module is now basically shrunk to a single method that you can plug into EPiServer in the Global.asax. The routine tags a page with facets predefined in its parent, during the process of a page creation. This is useful for tagging e.g. all the &#8220;technology&#8221; stories with &#8220;technology&#8221; facet and an &#8220;News&#8221; facet once its created in the &#8220;Technology articles&#8221; branch.</p>
<h2>Furniture</h2>
<p>Part of the faceted navigation, but not directly part of the engine are editors for facet roles, the very facets and facet selectors.</p>
<img src="http://blog.najmanowicz.com/?ak_action=api_record_view&id=91&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.najmanowicz.com/2008/01/24/faceted-service-structure/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Faceted Navigation Engine Nomenclature</title>
		<link>http://blog.najmanowicz.com/2008/01/24/faceted-navigation-engine-nomenclature/</link>
		<comments>http://blog.najmanowicz.com/2008/01/24/faceted-navigation-engine-nomenclature/#comments</comments>
		<pubDate>Thu, 24 Jan 2008 15:36:35 +0000</pubDate>
		<dc:creator>Adam Najmanowicz</dc:creator>
				<category><![CDATA[.Net Framework]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[EPiCode]]></category>
		<category><![CDATA[EPiServer]]></category>
		<category><![CDATA[Faceted Navigation]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Web applications]]></category>

		<guid isPermaLink="false">http://blog.najmanowicz.com/2008/01/24/faceted-navigation-engine-nomenclature/</guid>
		<description><![CDATA[This article is the second of a series describing the faceted navigation system for EPiServer that we have internally developed in Cognifide, that&#8217;s already proven to be a robust solution for delivering tagged content a heavy traffic site, which will be released shortly as an open source project.
First of all we have to explain the [...]]]></description>
			<content:encoded><![CDATA[<p align="left">This article is the second of a <a href="http://blog.najmanowicz.com/category/episerver/faceted-navigation/">series describing the faceted navigation system for EPiServer</a> that we have internally developed in <a href="http://www.cognifide.com/">Cognifide</a>, that&#8217;s already proven to be a robust solution for delivering tagged content a heavy traffic site, which will be released shortly as an open source project.</p>
<p align="left">First of all we have to explain the nomenclature as it is going to be used quite a bit. A few terms we use pretty extensively are:</p>
<ul>
<li>
<div align="left">Facet &#8211; this is roughly an elaborate version of an EPiServer (or Wordpress) category. One of the problem with EPiServer category is that it is just that and absolutely nothing more. There is no way for attaching metadata and conditional structuring of the category tree. There is no way to assign them roles. Facets provide you with much, MUCH more.</div>
</li>
</ul>
<p><span id="more-88"></span></p>
<li>
<div align="left">Navigation space &#8211; Facets just like categories are structured in a tree, this is good for browsing them in a back end for tagging and organizing them. However we sometimes need to have a different view at facets structure based on the place we are in on the site. a good sample of that is <a href="http://www.setantasports.com/">Setanta Sports site</a>. you want to have a different navigation in the Sports (news) section and a different navigation when you browse blogs. Facets can have a different set of children and other facets that they expose based on the navigation space you are in.</div>
</li>
<li>
<div align="left">Facet collection &#8211; a simple set of any facets.</div>
</li>
<li>
<div align="left">Facet context &#8211; this is a special collection of facets possibly of many roles, but also abiding to the rules stated by Facet roles. Most notably a &#8220;current context&#8221; is a collection of facets the request has been performed with.</div>
</li>
<li>
<div align="left">Facet role &#8211; a facet can be a tagging unit like a category, but a facet can be much more. for that we came up with a concept of facet roles which allows us to profile facets:</div>
<ul>
<li>
<div align="left">ability to use for tagging &#8211; not all facets you necessarily want to be used for tagging. Some tags are indeed used to identify a content, but some tags play more utilitatian way like &#8220;locale&#8221; that we are in &#8211; you would not necessarily tag a content as being only available within a certain locale (although you might want to do that anyway), therefore a role &#8220;locale&#8221; may be set as not taggable. </div>
</li>
<li>
<div align="left">uniqueness &#8211; You may want to limit a role to only be able to has one of its member in any facet collection (IFacetrCollection). After all a user cannot be in 2 places at once so yet another logical extension for locale. Also request can only be performed within a context of one navigation space &#8211; therefore a navigation space representing tag need to be unique.</div>
</li>
<li>
<div align="left">separating facets of different roles &#8211; once you are presented with a context of tags, you may want to categorize them. e.g. to color a header in a control you may want to know which &#8220;sport&#8221; the tag represents.</div>
</li>
<li>
<div align="left">menu visibility &#8211; you may choose to display or not some tags in your navigation- this is the simplest way to specify that a meta-facets like say.. &#8220;flash video&#8221; should not generate a menu item as this is quite irrelevant to user.</div>
</li>
<li>
<div align="left">context mandatory &#8211; this indicates that any given context has to have at least one facet of that role &#8211; if a context does not have any of the facets of this role &#8211; a default facet for this role will be used. For example &#8211; a user cannot be placed in a null locale, he has to be &#8220;somewhere on earth&#8221;, doesn&#8217;t he? ;)</div>
</li>
<li>
<div align="left">availability for selection &#8211; this allows us to tell whether a facet can be used by editors and be visible on the site or whether it&#8217;s use is of more esoteric nature and the editor should not have it visible anywhere on the site &#8211; after all why would the editor want to see the navigation space representatives.</div>
</li>
<li>
<div align="left">System Role &#8211; this indicates that a role is crucial to the operation of the faceted navigation and as such should never be deleted.</div>
</li>
</ul>
</li>
<li>
<div align="left">Facet mappings &#8211; allows us to link facets to external id&#8217;s available outside the system. for example when you import an rss feed &#8211; you want to be able to always tag the articles from it with a proper facet &#8211; so for mapping &#8220;Rss Feeds&#8221; there will be mutually unique relation between a tag and a URL of the rss feed.</div>
</li>
<li>
<div align="left">Facet Navigation Info &#8211; allows the engine to specialize the facet structure within the navigation space &#8211; the navigation is a cross-section between a facet and a navigation space.</div>
</li>
<li>
<div align="left">Preferred Facet Hub Page &#8211; all facets can carry the information on what is their preferred page to be displayed(this is defined in the navigation info) . In any given context you don&#8217;t really care what page are you on &#8211; the page is just a visualisation of content that is defined by facets. But you may want your facet to cause a switch of this visualisation once it is becoming the dominating facet in the context (a facet with highest priority in the context) &#8211; So for any given set of facets &#8211; you query the URL provider with it and it will check the context and select the dominating facet and get the hub page for displaying the context from it. For example when you&#8217;re on a sports page and you click on a football &#8211; you want a more specialized page that might have some football tables on it rather than the generic sports page.</div>
</li>
<img src="http://blog.najmanowicz.com/?ak_action=api_record_view&id=88&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.najmanowicz.com/2008/01/24/faceted-navigation-engine-nomenclature/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The challenges of a high traffic site with EPiServer</title>
		<link>http://blog.najmanowicz.com/2008/01/23/the-challenges-of-a-high-traffic-site-with-episerver/</link>
		<comments>http://blog.najmanowicz.com/2008/01/23/the-challenges-of-a-high-traffic-site-with-episerver/#comments</comments>
		<pubDate>Wed, 23 Jan 2008 14:43:38 +0000</pubDate>
		<dc:creator>Adam Najmanowicz</dc:creator>
				<category><![CDATA[.Net Framework]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[EPiCode]]></category>
		<category><![CDATA[EPiServer]]></category>
		<category><![CDATA[Faceted Navigation]]></category>
		<category><![CDATA[Microsoft SqlServer]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Web applications]]></category>

		<guid isPermaLink="false">http://blog.najmanowicz.com/2008/01/23/the-challenges-of-a-high-traffic-site-with-episerver/</guid>
		<description><![CDATA[&#8230;with an unconventional approach to data fetching.
This article is a first of a series describing the faceted navigation system for EPiServer that we have internally developed in Cognifide and that&#8217;s already proven to be a robust solution for delivering tagged content a heavy traffic site, which will be released shortly as an open source project. [...]]]></description>
			<content:encoded><![CDATA[<p>&#8230;with an unconventional approach to data fetching.</p>
<p>This article is a first of a <a href="http://blog.najmanowicz.com/category/episerver/faceted-navigation/">series describing the faceted navigation system for EPiServer</a> that we have internally developed in <a href="http://www.cognifide.com/">Cognifide</a> and that&#8217;s already proven to be a robust solution for delivering tagged content a heavy traffic site, which will be released shortly as an open source project. The article outlines some pitfalls of EPiServer that we&#8217;ve run into and the nature of the <a href="http://www.setantasports.com/">project</a> in which the module was used first and which influenced a lot of our design decisions.</p>
<p>This article and the Faceted Navigtation module is developed on EPiServer 4.61 and not the latest version 5 of the CMS so far, so mind that some of my reservations may not be a problem if you&#8217;re just starting to work on a brand new project and have the luxury of using new features of it. </p>
<p>Also (which may be a good thing) our sites uses a different approach to navigation the content, we do not really care much for the tree structure, but we treat all EPiServer pages equally when looking for content because of how the site is designed from the creative point of view.</p>
<p><span id="more-87"></span>
<p>The <a href="http://www.setantasports.com/">project</a> is a vast site with:</p>
<ul>
<li>tens of editors working on it simultaneously.</li>
<li>millions of uniques per month</li>
<li>tens of thousands of articles in just about half a year</li>
<li>5 IIS servers working in tandem on a single SQL database</li>
<li>The page cannot be cached as a whole as it contains dynamic and Geo-targeted content.</li>
<li>The content on the page changes every other minute or more often</li>
<li>There is a great deal of automated content coming from various feeds.</li>
<li>A content can be both feeded automatically based on the time of publishing as well as forced in some controls and no article can appear on a page twice, yet controls have to have predefined number of links. May not seem hard to do, but believe me once controls will start stealing articles form each other you&#8217;ll see why I listed it as a main feature.</li>
</ul>
<p>First thing to give the credit where it&#8217;s due &#8211; let me enumerate the good sides of using EPiServer in the scenario (the parts that we found particularly useful):</p>
<ul>
<li>EPiServer provides a beautiful interface to the editors. Both for editing pages and organizing the content.</li>
<li>EPiServer provides a great infrastructure for us to plug into it with property types, and GUI plugins</li>
<li>EPiServer allows us to use as much or as many of its elements as we need &#8211; from our point of view we mostly use it as a repository and pretty much ignored all of its custom controls and a great deal of its APIs (which I&#8217;ll explain later why.</li>
</ul>
<p>The list does not seem like a long one &#8211; but believe me &#8211; all of the points are fundamental to the success of the site! The editors love the UI, the developers love the extensibility and &#8220;pluggability&#8221; of the APIs. And the logical structure of the database allowed us for flexibility in skipping some APIs where it proved that a direct database call was beneficial.</p>
<p>The bad part is basically that the EPiServer API is slow for what we needed it to perform (the site can easily reach a couple of thousand simultaneous connections at peak times), if we wanted to use GetPage() for every link on the site we would be in serious troubles.&nbsp; At our average of 155 links per page, this was a serious problem. </p>
<p>Also since we have a structure of the tree that is not directly reflected on the site, but rather we search by &#8220;categories&#8221;. The idea of the site is that it is a huge search engine that displays the freshest content content based on the facets it is tagged with. Using the EPiServer APIs we would have to use FindPagesWithCriteria() which in itself is probably the most disliked call speed-wise. Also categories in themselves do not support any metadata (there are no properties for categories). Needless to say &#8211; we had to implement our own code for this kind of creative approach and that&#8217;s what we did.</p>
<p>In effect, what we limited to the list of hardest abusers are:</p>
<ul>
<li>FindPagesWithCriteria()</li>
<li>Getpage()</li>
<li>GetChildren()</li>
<li>and (mostly based on <a href="http://www.episerver.com/templates/PageWithRightListing.aspx?id=8128&amp;epslanguage=EN">Mat&#8217;s article</a>) use of dynamic properties.</li>
</ul>
<p>Basically all the calls that return PageData or PageDataCollection are all potential candidates for heavy caching.</p>
<p>The main approach that we took in our solution is &#8220;cache the hell out of it, but do it smart&#8221;. Don&#8217;t cache PageData unless there is absolutely no other way. Cache links, page titles and data that&#8217;s potentially used on every page.</p>
<p>Also where needed and justified by the speed increase we reach directly to the database &#8211; skipping some EPiServer APIs (At this point this is just one call as we want the solution to be easily portable between various EPiServer versions).</p>
<p>More (and the solution) coming shortly&#8230;</p>
<img src="http://blog.najmanowicz.com/?ak_action=api_record_view&id=87&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.najmanowicz.com/2008/01/23/the-challenges-of-a-high-traffic-site-with-episerver/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
