Showing posts with label Usability. Show all posts
Showing posts with label Usability. Show all posts

Monday, September 24, 2007

EPiServer Code: Send a warning email when a page is about to expire

As you might imagine I find it difficult to keep my hands of the brand new v.5. So naturally I've been searching out excuses to try out coding some small samples against the API.
Here's a feature that I've heard requested from several intranet customers already - An automatic email that informs the owner of a page that it's about to expire.
"What a great idea" I thought first time I heard it - One of the major problems with most intranet is outdated information so I can easily imagine companies having a policy that all pages on their intranet should have an expiration date - and I can just as easily imagine the need for owners to change that expiration date, if the information is still relevant hence producing the need for a warning email.
First off I could see several approaches to making this in EPiServer:
  1. Hook into the right DataFactory event from the global.asax and send a mail whenever a page is expiring
  2. Use the v5 support for workflow foundation and make a workflow that performs a SendEmail activity when a page is moved to the archive
  3. Set up a scheduled task to check for pages about to expire
Although I found option 2 very encharming due to the use of workflows, I decided to make an implementation of option 3 - since this was the only approach that would send out a warning email before the page actually expired (and any damage was done).

I made a new C# Code library project, added references to the relevant EPiServer dlls (and log4net to enable logging) and wrote this code:



using System;
using System.Collections.Generic;
using System.Text;
using EPiServer.PlugIn;
using EPiServer;
using EPiServer.Core;
using EPiServer.Filters;
using EPiServer.Security;
using EPiServer.Personalization;
using EPiServer.Configuration;
using System.Net.Mail;

namespace Allan.EPiModules
{
[ScheduledPlugIn(DisplayName = "Page Expiry Warning")]
public class ExpiryWarningJob
{
private static log4net.ILog _log;

static ExpiryWarningJob()
{
_log = log4net.LogManager.GetLogger(typeof(ExpiryWarningJob));
}

public static string Execute(){
int num = 0;
//Find pages that will expire in a day
PropertyCriteria criteria = new PropertyCriteria();
criteria.Name = "PageStopPublish";
criteria.Value = DateTime.Now.AddDays(1).ToString();
criteria.Type = PropertyDataType.Date;
criteria.Required = true;
criteria.Condition = CompareCondition.LessThan;
//...but hasn't already expired
PropertyCriteria criteria2 = new PropertyCriteria();
criteria2.Name = "PageStopPublish";
criteria2.Value = DateTime.Now.ToString();
criteria2.Type = PropertyDataType.Date;
criteria2.Required = true;
criteria2.Condition = CompareCondition.GreaterThan;
PropertyCriteriaCollection criterias = new PropertyCriteriaCollection();
criterias.Add(criteria);
criterias.Add(criteria2);
foreach (PageData data in DataFactory.Instance.FindPagesWithCriteria(
PageReference.RootPage, criterias,
null, LanguageSelector.MasterLanguage(), AccessLevel.NoAccess)
)
{
SendMail(data);
num++;

}
return string.Format("{0} expiry emails sent", num.ToString());

}


private static void SendMail(PageData p)
{
//Identify user profile.
//Consider using the ChangedBy instead of CreatedBy.
EPiServerProfile esp = EPiServerProfile.Get(p.CreatedBy);
if (esp.Email != null)
{
try
{
//Build a new mail message
MailMessage message = new MailMessage("expire@" + Settings.Instance.SiteUrl.Host, esp.Email);
message.Subject = "Page \"" + p.PageName + "\" is about to expire";
message.Headers.Add("X-Mailer", "EPiServer CMS");
message.Headers.Add("Content-Base", Settings.Instance.SiteUrl.GetLeftPart(UriPartial.Authority));
message.Body = "The page <A href=\""
+ Settings.Instance.SiteUrl.GetLeftPart(UriPartial.Authority)
+ p.StaticLinkURL + "\">"
+ p.PageName
+ "</A> will expire on "
+ p.StopPublish.ToShortDateString();
message.IsBodyHtml = true;
message.BodyEncoding = Encoding.UTF8;
SmtpClient smtp = new SmtpClient();
//Make sure the web.config sets up the SMTP Client.
smtp.Send(message);
_log.Info("Expiry warning sent to: " + esp.Email);
}
catch (Exception e)
{
_log.Error("Failed to send expiry warning", e);
}
}
else _log.Warn("Unable to send expiry warning to " +
esp.DisplayName +
" - no known email address");
}
}
}

The dll should be placed in the EPiServers "bin" folder and then it will automatically be loaded. The ScheduledPlugin attribute will make it appear as a scheduled task in Admin mode. Here you should probably set it to run once a day - perhaps in the early hours of the morning will be best.
You also need to make sure the web.config is setup to the SMTP server.

The code is a pretty simple sample that will find the pages that are about to expire (the following day) and then send a mail to the creator of each page that it's about to expire.

The sample was made in less than a day and of course it still could use a lot of work to be really nice. Ideas for improvements:
  • Group expiration mails so that each user won't be bombarded with several mails every day
  • Consider how long time before people should be warned that the pages are about to expire - is 1 day time enough?
  • Consider if it's really the creator that should get the mail - perhaps the last person to have updated the page would be the right one?
  • Build functionality together with tasks - so instead of emails a task to check the page should be created.
Enjoy!

Friday, July 6, 2007

EPiServer 5 CMS - First impressions

A couple of weeks ago I wanted to check out how the new EPiServer 5 looked, so I downloaded a free trial version of the RC2.
It comes in two flavors. There's the traditional installer that installs the Manager which allows you to setup new EPiServer websites with a default look & feel, but on top of that there's also a new Visual Studio integration available that I instantly knew I just had to try out.

The install itself was very (!) easy and without any problems or hickups I had a lot of new features in my visual studio.
For instance I now had the possibility of creating a new EPiServer Project which I instantly did.
This template created blank episerver website, db, etc. for me ready to use.
It's really clear to see that with this new release the clever guys at EPiServer has been focussing a lot on improving the quality of life for all the developers out there who use it as an every day tool to make websites.
At the same EPiServer is now even tighter coupled with the newest Microsoft technologies, basing their CMS on standard ASP.NET 2.0 things like Master pages and ASP.NET User/Role configuration. They've also done a tremendous job of integrationg Workflow Foundation into the core functionality - and to this date this seems like one of the best usages of WWF I've seen so far.

Seen from a developer perspective the new SDK makes me think of EPiServer as a huge toolbox that gives me a lot of tools to efficiently create cool websites and webfunctionality in a standard ASP.NET way, while taking care of a lot of the tedious details. But from an Editor / Administrator perspective you still get the well-known intuitive webbased interface for administrering and editing the website. Cool.


The editor and administrator interface hasn't changed all that much since last version and the entrypoint is still the "famous" right-click menu for logged-in editors. It seems to me like the Editor interface hasn't gotten all that much work done except for a paint-job and perhaps some improved versioning/comparison features (however I could be mistaking, having never been a real-life editor :-) ). Thats okay, though. Rome wasn't build in a day and I certainly prefer the improved SDK and architectural changes.
Yes, I am the kind of guy who cares more about whats under the hood of my car, than the color, shape and sexiness of it's exterior. However it still wouldn't hurt to give a bit of attention to improve the (already good) usability for editors and administrators in a future version. Perhaps AJAX is a good approach here.

While I'm at it, here's another few things for my wishlist for future versions: WCF support for easier data / functionality access and a couple of nice fully-featured demo-sites / templates for the SDK. It could be nice to a couple of ready-to-go samples as VS Templates.

All-in-all I'm very impressed with the RC2 version of EPiServer 5 and I can't wait to play around with it some more. Don't be surprised if a couple of modules start appearing on this blog for free download in the near future. EPiServer continues to be a powerful workhorse in the CMS world, not as flashy and shiny as some competitors but intuitive, strong and flexible.

Tuesday, February 20, 2007

Mysteries and Mental Models

I've for quite some time been wanting to write a post about a phenomenon I've encountered numerous times, and now I finally persuade myself to put my thoughts down in words. Let's for now just refer to the phenomenon as "Black Box of Mystery" (BBM).

It's a well known fact in the world of computer-human interaction that a lot of usability problems arise when the mental models in the user interface doesn't match the mental models of the user. Then the software seizes to be intuitive and the users stop using it (or at least they'll hate using it). Put in other words, a user interface should behave as if it is what the user thinks it is. So far so good. But now the problems starts pouring in. For users might be at different levels of knowledge and hence have different mental models. And what about that software thats just too complex to be understood?

I have some examples of how people react to BBMs.
When I sit in my car and turn on the wheel, it fits my mental model perfectly that the wheels start turning, and if I'm driving the car will begin to turn. The steering wheel is at least a part of my car thats not a BBM (several other parts are).
In my car I also have a navigator. It would have been a scary BBM to me before I learned about shortest path algorithms and GPS. Now I've luckily learned to accept it, but it did take some adaptations of my mental model. My wife on the other hand doesn't care how it works. She has accepted that it's a black box and just has full faith in it's working. I have tried to ask her how she thinks it can decide on good instructions for her to find home - her answer was simple "well..it's has a GPS so it knows where I live". I suppose her answer is correct in a way.

My beloved grandmother had a TV, and although she spend most of her time watching it she also claimed to hate it. She was afraid of it - cause she didn't understand it. To her it was one big BBM, and she certainly didn't appreciate the fact that she didn't know how all the little people had gotten inside it. She always needed help to tune it to the right channels, and if it was moved and a cable fell out, she'd call somebody to fix it, terrified of touching the thing herself.

I feel the same way about BBMs I encounter in my daily life. Like the SqlAdapter in the .NET framework. I know Microsoft wants me to use it to connect my datasets to my sql-server, but I don't trust it. It's totally a BBM to me and I'd always prefer to use SqlCommands instead, cause they fit my mental model more. They do what I tell them to, when I tell them to do it - and I can fully understand their purpose.
I guess thats something really tricky when you develop API's and frameworks. It's quite difficult to know the domain knowledge level at all users and hence it can be tricky to match their mental models without making BBMs for some of them.

As a part of MondoSearch we had a similar problem. When we first started making .NET API's to the search engine we faced the problem that all the users implementing it was webmasters with little or no .NET / programming knowledge.
In spite of coding examples and lots of guidelines and manuals our support was flooded with problems caused by bad/wrong code.
Something had to be done so we decided to make a SearchControl that could be put on aspx pages that handled all the typical logic related to having a search and result-page, code that was typically error-prone. Stuff like recreating a search upon postback, navigating in search results, narrowing the search, connecting to underlying search-API and so on.
When we released the SearchControl the non-developers like webmasters and supporters liked it instantly because it empowered them to do a lot of things they would have given up on doing before. But then our audience changed. The world had accepted .NET and that making a web-site was a joint developer/graphical designer/webmaster/??? task and all of a sudden we had developers getting annoyed with our Search Control. Why? Because to them it was a BBM that they didn't dare to use...
We soon after released a web-service that rendered a pretty clean code-wise access to all the search functionality. Today we maintain both interfaces and are in fact trying to adjust the SearchControl to be more "developer-friendly" by making it's actions and functionality more controllable and transparent.
But all in all I guess it helped me to learn a little lesson about Black boxes and their effects on people.

Friday, February 16, 2007

MondoSearch for EPiServer (Part 1)

Last year, while I was creating the MondoSearch for Sitecore integration I was at the same time technical-contact/project manager for the MondoSearch for EPiServer integration. Besides from keeping me busy for half a year, this provided an excellent opportunity to learn a lot about these two state-of-the-art content management systems, each with their own strengths and difficulties.

With the EPiServer I was so lucky to be working with the former (now again current) EPiServer Product Chief, Roger Wirz, through his company Briomera. In the end I was very pleased with the results of our joint work - it turned out to be quite a cool integration of the products, deeper integrated than any other EPiServer search tool I've seen. In November and December I got to travel around Sweden and demonstrate it to EPiServer partners in both Gothenburg and Stockholm. It got a lot of interest, and several customers are already making their own implementations based on the integration.

I've been wanting to share some screenshots of the integration with you all, so here goes.

Just as with the Sitecore Integration, the integration for EPiServer is also based on the MondoSearch Integration Services, which is a set of XML Web Services, that's based on MQL and DataSets.
In the Configuration section it's possible to setup the connection strings and urls to all of the web-services as well as using the Diagnostic tool to check that all services are up and running. This is a handy one-place-stop for trouble-shooting.


If we stay in the Admin section of EPiServer we might draw our attention to the Crawler Control.
This is where you can control the indexer, see crawler logs, manually start a new crawl, and also setup an EPiServer Heart Beat that on regular intervals checks if it's time to start the crawler - and if the last crawl went okay.

When it comes to the actual search implementation, we've adjusted the standard MondoSearch Template 1 to work within EPiServer, and also created a PageType for it.
By adding a User Control with meta-tags to all the pages we're also able to enhance the meta information on the pages as well as categorize either using EPiServers categories, or the built-in MondoSearch Categories.
All text-strings used on the search-page can be found in EPiServer style language xml's and can quite easily be translated.
In the integration we've also included support for 2 authorization methodologies in order to fully support EPiServers authorization. This means that when you search on your EPiServer you'll only get back the results you are allowed to see.


Since the Editor search that comes with EPiServer sometimes can leave you wanting a bit more we also included an Editor Search based on the MondoSearch index of the website. This is an easy way for editors to find the documents they want to edit.






This was a brief introduction to the configuration and searching facilities in MondoSearch for EPiServer. When I have time I'll post some more screenshots of the neat interaction with BehaviorTracking and InformationManager from within EPiServer.

Thursday, February 15, 2007

Hall of Fame: Coleman.com

Every now and then I come across a search implementation I really, really like.
Some places where people think outside of the customers) on their site. In these days where the search market it being heavily commoditized, and more and more websites doesn't care about the quality of their search functionality as long as they have it, it really fills my heart (I know, I'm turning thisbox in order to help the visitors (and/or into a sob-story) with pride to when I encounter MondoSearch customers which has gone that extra mile to use make something thats cool to use.

One of the MondoSearch implementations that I most often showcase to people wanting to see the real power of good site-search is the solution they have at coleman.com.
Coleman.com is a US-based camping gear business, and I think they've made an awesome implementation.

Their solution isn't based on the latest technologies, in fact they still rely on good ol' asp to do the job, but they still managed to put in a couple of really nice features.

Try to go to coleman.com and search for "tents" or "Coolers" or any other product that you'd be interested in.
Now the first thing you'll see is probably a SearchHeader (a query-related banner-add). This will take you directly to a relevant offer they might be having at the moment - or just shorten your way to the products of your interest. I don't know the internal work flows of Coleman, but I can imagine these SearchHeaders being the result of them analyzing frequent search words on the site and then adding SearchHeaders as a response to it in order to help people searching for the most popular terms.
Underneath the add comes the results, in categories. This is an excellent example on why it sometimes can be a good idea to show results in categories.
In the case where you searched for "tent" it's unclear if you are interested in:
a) buying a tent
b) Getting parts for a tent
c) General information about tents
d) Tips on how to use your tent
e) ...

Luckily Coleman Search presents you with the best results within each category right on the first result-page.
Most people are probably interested in buying a tent, so naturally that category goes on top.
And this is what it all comes down to: Search is all about not wasting peoples time. Don't make people waste time on your website looking for the products they want to buy, bring it to them when they ask for it. And when you present them with a search result, make it easy to pick the right result.
In this case, Coleman helps the users by actually showing a small picture of each tent in their "Products" category, along with the price. And if a users feels like buying a tent right there and then, well - it's no problem - just click the link directly on the result-page and add a given tent to your cart!
If you scroll down the results you'll also see a category of Manuals to the various products sold by Coleman. In this case it's quite helpful that they provide a pdf-icon next to the pdf-documents so the user will know what to expect if they select that link...How many times have I not been lost on a company's website, clicked on a result link and then had to wait for x minutes while firefox desperately was trying to load a huge pdf, when I was just expecting a standard document.
In general I find it's always a polite gesture to tell people what they'll get if they click on a link - and especially warn them if they'll end up with something like a pdf (not that I have any problems with pdf-files :-).

At the bottom of the result-page we find the "Advanced Search" field, for searching again and this is actually the first place where I have a little bit of criticism...This area seems a little bit messy in my eyes. There are no clear Gestalts separating the category selection and the search-type selection, and in my opinion both selections are unnecessary. Since the results are divided into categories, and it's possible to drill-down from the results I think the advanced category selection is redundant (and I bet that only very few people actually use it). The same goes with the Search Type. Here it's defaulting to AND-searches, which can be pretty dangerous. Suppose a visitor searches for "Camping Tent". He'll get significantly fewer results than a visitor searching for "Tent" - because not all of the tent-product pages contain the word "camping" although the tents could probably be used for camping :-)
I tend to prefer OR-searches, given that if a document matches all the search-words it's still ranked better than documents matching only some of the search words.


All in all I think it's a nice search implementation with the only recommendation that more simplicity in the Advanced Search section would be nice. Potentially they could also expand the search to include some search-filters, like "search only for products cheaper than X" - I'm sure some users would find that handy.

Tuesday, February 6, 2007

New Functionality: Related Articles

Here's one of those small things I've been working on over the weekend.
If you're using IE, you should now be able to see a new widget-like thing in the bottom of the right-hand widgets. It's "Related Codeproject Articles".

The concept I use to get these related articles is somewhat similar to how the "Related Pages" functionality works in the MondoSearch/Sitecore integration - just based on another platform.

I've written a small piece of javascript that extracts the keywords on this page, and then calls a serverside function to perform an MSN Search on the keywords on one my my all time favourite websites, codeproject.

It's still quite experimental so I don't expect it to work in all scenarios - but possibly a few lucky readers will get to enjoy this functionality now :-)

If anyone is interested in more details as to how it's done, drop me a comment - I might be persuaded to share the code...

Wednesday, January 31, 2007

MondoSearch for Sitecore (Part 3)

As promised, I'm going to share some more screenshots of the integration between MondoSearch and Sitecore. This time I'll focus on the integration of BehaviorTracking.

BehaviorTracking Portal. The main entry to the BehaviorTracking information from within Sitecore is in the BehaviorTracking Portal, a portal somewhat similar to the well-known Sitecore Today portal, only this time the portlets filling it are BehaviorTracking portlets. Although we're still missing some of the graphics from the original BehaviorTracking this makes out a pretty decent approach to discovering what your website visitors are interested in and by double-clicking on a given keyword, it will open the BehaviorTracking Term Details for that search term.



BehaviorTracking Term Details. When you want to examine a specific search term, you can use the XAML application Term Details. Here you can look up search words, and examine

a) Which search terms are related (meaning which other terms are typically used by the same users in their searches). This can be quite helpful in inspiring new keywords for pages as well as new synonyms for the search.


b) Which pages are typically chosen from the result page, giving you a more exact idea of what the user actually meant. Use this for improving ranking of some pages, or perhaps adding a searchheader or searchname for a given page.


c) The most recent user sessions searching for this term. This might not be so useful, but it does give you that cool "Big brother" feeling :-)


Finally, you can also get BehaviorTracking Item Details. For any given item on the website that inherits from the MondoSearch Base Template, you can see a list of which search terms sent users to the various versions of this page. This is an excellent tool to optimize the content on the individual pages, to the expected content of the users.




As mentioned in Part 2 of this trilogy the along with the integration we also released some code samples, showing how to use BehaviorTracking and search to spice up your site.

On last of these examples is the "Most Wanted" list that is a small control listing the top 5 pages most often chosen from a search result page. I find this to be quite useful, as this is not the most visited pages on the website (the most visited page on a website is quite often the front page that doesn't hold any relevant information at all), but the pages that most people have been looking for. In many cases it will be quite a good help for your users to promote these pages on the front page so they can go directly to them without wasting any more time.

Improving Search with BehaviorTracking

The topic for this post is Behaviortracking (check out the website, cause I'm not gonna spend time here explaining what it is). This is a post where I'm basically gonna pretend I'm in marketing and fill You, my dear reader, with something that might resemble a sales pitch for a particular product.. "Why?" and "Where's the code?" I hear you ask. Well, first of all I feel quite strongly about this - I've seen so many websites that ought to start listening to their visitors instead of their executives - and with regards to the code...well I'm sorry no code this time.

The reason BehaviorTracking is such a cool tool, is that where other web analytics software might tell you about popularity of pages and server loads during the day, BehaviorTracking tells you exactly what you need to know: What are users looking for on my site.
In my mind it's perfectly obvious.
A website is to some degree like a shop. You have some users who browse around the shop, looking at the shelfes and eventually leaving, and some other users who go directly to the clerk at the counter and ask for a specific item. Obviously the people going directly to the counter with a specific goal are the ones most likely to buy - and naturally these are the people you want to listen to. Now, suppose you are the proud owner of a clothes store and a customer walks up to your clerk and asks for a specific pair of "Levis" jeans. Would you like that answer to be:
a) duuh
b) I'm sorry, I don't know anything
c) The jeans department is over there
d) Here is a number of Levis jeans that should fit you, this pair is very popular and this pair here is on sale this week. By the way could I also interest you with a new shirt that matches to go with that?
e) We don't have any Levis jeans at the moment, but I'll make sure to order some. Meanwhile perhaps you'd like to check out this competing brand that looks similar and is a bit cheaper?

(I'm no sales guy, but I could imagine two of the above answers being good - you figure out which).
A good search engine is like a good sales guy greeting people at your store, helping them while selling your products. But in order to always provide the best assistance it needs constant optimization - and thats where BehaviorTracking comes into play. By frequently examining the search patterns of the visitors it's easy to customize not only the website but also the search engine to provide the best possible service to your visitors.

Monday, January 29, 2007

MondoSearch for Sitecore (part 2)

As earlier promised, here's some more info on v. 1.1 of the integration between MondoSearch product suite and the Sitecore CMS system, that was released just before christmas. In this second part of my story I will focus on the search itself and the ways it has been integrated.

The point of the integration was to integrate not only the search engine but also search analytics, crawler administration into Sitecore, making Sitecore a common user interface for both products.

The reason is simple. Although website search over the last couple of years has become increasingly commoditized it's not just something you plug in once, and then expect to have working perfectly ever after. Search is a dynamic thing - like the website it indexes and for the best end-user experience it should be continiusly tweaked and improved to match the expectations of the end-users. The ideal way to do this is by studying the behavior of the users and then optimize both website and search for them (I could talk for hours about this subject, but I'll safe that for another post). Nevertheless that makes it even more important to make the Search and Behavior analytics easy to use for the webmaster/marketing dept. responsible for a given website - and hence we decided to go for as complete an integration between the products as possible.

The search part of the integration includes:

3 Search Result Sublayouts, all based on a Search Template. All of the support Sitecore authorization enabling them to only show the results the logged-in user is allowed to see. All the texts used on the templates is defined in the template, so it's easy to translate in Sitecore. The Sublayouts use the standard MondoSearch SearchTemplate technology so it's easy to change look & feel and add functionality.














2 SearchBox sublayouts, simple and advanced that can be placed on any layout to enable the possibility to search.

Click Item and corresponding layout, enabling logging and highlighting of search results.


A Meta-data xslt rendering for sending item-related meta-data to MondoSearch.



A Base template that allows Sitecore items to have fields to hold meta-data for MondoSearch, including Search categories and indexing rules.














A Crawler Control XAML application that allows an administrator start and stop the MondoSearch crawler as well as publising crawled databases. This tool will also display the current status of the crawler, crawler log and number of indexed pages.


A Sitecore task for starting the crawler
so the Sitecore scheduler can be used to scheduling crawls.


An Editor Search XAML application that allows Sitecore editors access to use MondoSearch to find the items they want to edit. When a result is selected it will of course open in the Content Editor for easy editing.



Templates and items for defining Categories used in Search.



MondoSearch Examples
On top of the integration Mondosoft also supply some coding examples of how to improve the overall functionality on the website. Like this Autocomplete search box that uses frequently searched words as autocomplete suggestions that appear while you type a search query.




One of the other examples is a "Related Pages" box that will use the search engine to search for other related pages to the current page, and "Related Topics" that will use Behavior Tracking to suggest search terms relevant for the page you are currently on.

Now, this was just a brief overview of the "search part" of the integration. In the next post I'll go through all the new cool features the integration adds to Sitecore to track visitor behavior and search term popularity.
Later on I'll also show how the it's possible to add SearchHeaders (custom html/sponsored links) to the search results from within Sitecore and outline a couple of ideas I have on how to further improve the overall value of a Sitecore website.

The new update of the Integration demo-site is due to be launched any day now and it'll be possible for all interested to try out these features on their own - either on the demo-site, or by downloading the integration.

Blogspot hint: Google optimization

I just implemented this little optimization of the blog in the hope that it'll improve Google's search results. The problem I noticed that if you find this blog through a search on google, you'll quite often get a link to the front page (allantech.blogspot.com/index.html) in your search results because a related article was on the front page at the time when google indexed the site. However with the current update rate it's also quite likely that when you click that link, the article is removed from the front page already. An example: today I searched for "AllanZip" and this is the result I got:Notice how you are directed to the front page instead of the article page.
The way to avoid this is to put a robots meta-tag on the front page, instructing google to "noindex,follow" meaning "don't index this page but follow the links" - however this shouldn't be put on the item pages. Since BlogSpot uses the same template for both the main page and the item pages, this took a little bit of research, but finally I got this code to do the trick:


<b:if cond='data:blog.pageType != "item"'>
<meta content='noindex,follow' name='robots'/>
</b:if>


I hope this little trick will improve the search results - let's see when Googlebot will honor me with yet another visit :-)

Saturday, January 6, 2007

Is AJAX the spice that makes search taste better?

Last spring I wrote a 7,5 ECTS project at ITU along with a friend, Peter Madsen, on AJAX and it's usefullness for improving functionality in a web application - in this case website search.
It was kinda inspired by all the hype around Web 2.0 and the cool features AJAX technologies allows you to do on a webpage.
It's really fascinating the way the web is moving from pages with information towards applications with communication.
To try out the technology we setup two identical search & result pages, that searches on a mondosearch which have indexed www.itu.dk. One of them we did our best to AJAX enable (narrowing search results on the fly, no full post-backs, scrollbar navigation).
Check out the samples here. If you have difficulty sleeping and feel like reading the end report, download it from here.

Later on I've been quite interested in all the possibilities there is in using AJAX along with data from user behavior to improve search - one example could be a feature like an autocomplete drop-down in the search field that suggests commonly searched queries (yes I do realize that this feature has gotten quite popular several places after Google introduced Google Suggest).

The end conclusion of our report? We kind of agree that AJAX is definetly a cool technology that can help extend the functionalities on current old-tech html pages....But the downside is that it's ugly as hell - using tons of different technologies to interact in a spider-web-chaos. Whats really needed is a new web-architecture thats intended for this use and thoroughly designed - not a big rag of patchwork upon patchwork.
This being said, I still won't hesitate to use AJAX to spice up my web-applications in the future.