Posts Tagged ‘Search’

CKS:Enhanced Blog Edition – Enable Search

April 1st, 2008 by Tobias Zimmergren

The other day I started coding a custom searchfunctionality to use with the Community Kit for SharePoint’s Enhanced Blog Edition (CKS:EBE) – which is what this blog is running on.

However, while it would be fun and all to create a new custom search functionality for the EBE – someone beat me to it.

Daniel over at ZevenSeas has posted a blogpost on the subject and explains what the searchbox can do.

You can download the project on codeplex here.

Screenshots of the searchbox in use with the EBE:

scr001

scr002

Hope that you can find some good use for this searchbox, it’s working really good to be honest. Good work Daniel.

Some more customizations are to be done, then I’m set for tonight and will shortly begin my Silverlight 1.0 integration blogpost which I’ve postponed for too long now.

Cheers

Author: Tobias Zimmergren
Url:
http://www.zimmergren.net

If you’ve read my last two blogposts you already know how to configure ASP.NET 2.0 AJAX for your SharePoint Server and how do deploy a UserControl that uses AJAX functionality on you SharePoint Server.

You can find my previous articles here:

This blogpost shows a simple implementation of a UserControl that uses the Object Model to query the search service using a keyword and then using an UpdatePanel in AJAX to present the result to the user without any page reloads.

Let’s create an AJAX based UserControl which purpose will be to search using the Search Query Object Model

Copy the nessecary assemblies to your local bin folder (I’m deploying locally to the WebApplication on port 80)

To make this work (in this case, since I’m deploying to the UserControls folder with inline code, not calling any own assemblies) you need to copy the two .dll files to your /bin folder of the WebApplication where you want to deploy this UserControl.

  1. Copy C:Program FilesCommon FilesMicrosoft Sharedweb server extensions12ISAPIMicrosoft.Office.Server.dll
  2. Copy C:Program FilesCommon FilesMicrosoft Sharedweb server extensions12ISAPIMicrosoft.Office.Server.Search.dll
  3. Paste the two files to C:InetpubwwwrootwssVirtualDirectories80bin (Note: It can be any other port other than 80 if you’re deploying to another WebApplication)

The reason that we copy these files to our deployment target’s /bin is simply that I’m deploying locally to that WebApplication and some of the namespaces and classes that we need to use in order to be able to query the Search Object Model are availible in those assemblies. There’s better ways to accomplish this, but to keep it simple I’m going with this approach.

Create the custom AJAX UserControl that will query the SharePoint Search Query Object Model

For simplicity, I’ll reference all the servercode inside the <script> block and not using a code-behind assembly.

  1. Launch Visual Studio 2005 (or whatever version you’re running)
  2. Create a new file based on the "Web User Control" template, name it as you please
  3. Add the following tags just below the Control directive:

    <%@ Register Assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Namespace="System.Web.UI" TagPrefix="asp" %>
    <%@ Import Namespace="Microsoft.Office.Server" %>
    <%@ Import Namespace="Microsoft.Office.Server.Search.Query" %>
    <%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajaxToolkit" %>

    It could look something like this:
     searchajax1

  4. Just below all the references you just added, add the following code:

    <script runat="server">

    </script>

  5. Add the following code right below the references you just added. This code is simply to give us a simple user interface for the user to perform the search from:

    <asp:UpdateProgress ID="UpdateProgress1" runat="server" AssociatedUpdatePanelID="UpdatePanel1">
        <ProgressTemplate>
            <img src="http://zimmergren/hostedImages/ajax-loader.gif" alt="Searching…" style="border: 0px none #fff;"/>
        </ProgressTemplate>
    </asp:UpdateProgress>
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            Enter a keyword to search for<br />
            <asp:TextBox ID="tbSearchString" runat="server" Width="230px"/><br />
            <asp:Button ID="btnSearch" runat="server" Text="Search" OnClick="btnSearch_Click" />
            <asp:Literal ID="literalSearchResults" runat="server" />
        </ContentTemplate>
    </asp:UpdatePanel>

    It could look something like this:
     searchajax2

  6. Insert this code inside the <script>-tag you created earlier:

    protected void btnSearch_Click(object sender, EventArgs e)
    {
        // Job insurance, to pause and show that the UpdateProgress works
        System.Threading.Thread.Sleep(2000);
        try
        {
            string startTable = "<table style="width: 100%;">";
            string endTable = "</table>";
            string searchResultItem =
            "<tr>" +
                "<td><a href="{0}">{1}</a></td>" +
            "</tr>" +
            "<tr>" +
                "<td>" +
                    "<em>{2}</em>" +
                "</td>" +
            "</tr>" +
            "<tr>" +
                "<td>Site: {3}</td>" +
            "</tr>" +
            "<tr>" +
                "<td style="padding-bottom: 10px;">Author: {4}, Item Size: {5}</td>" +
            "</tr>";

            string outputResults = startTable;

            ServerContext context = ServerContext.GetContext("SharedServices1");
            KeywordQuery keywordQuery = new KeywordQuery(context);

            keywordQuery.ResultTypes = ResultType.RelevantResults;
            keywordQuery.EnableStemming = true;
            keywordQuery.TrimDuplicates = true;
            keywordQuery.QueryText = tbSearchString.Text;

            ResultTableCollection results = keywordQuery.Execute();
            ResultTable resultTable = results[ResultType.RelevantResults];

            if (resultTable.RowCount == 0)
            {
                literalSearchResults.Text = "Sorry, your search didn’t return any results";
            }
            else
            {
                while (resultTable.Read())
                {
                    outputResults += string.Format(searchResultItem,
                        resultTable.GetString(5),
                        resultTable.GetString(2),
                        resultTable.GetString(6),
                        resultTable.GetString(8),
                        resultTable.GetString(3),
                        resultTable.GetString(4));
                }
            }
            outputResults += endTable;
            literalSearchResults.Text = outputResults;
        }
        catch (Exception ex)
        {
            literalSearchResults.Text = ex.Message;
        }
    }

    Instead of going all crazy about how the code actually works with the Search Query Object Model, I’m just pasting the code here for you to try and will explain the Search Query Object Model in another article.

Deploy the UserControl
  • Copy or Save the UserControl to the following location: C:InetpubwwwrootwssVirtualDirectories80UserControls and you’re all set.

If you’ve configured AJAX and installed the SmartPart you should be all set and be able to use it. See this short post on using the SmartPart if you don’t know already.

Final Result

This is what it looks like when you hit the button (the red image spins around for 2 seconds (see the code, Thread.Sleep(2000)) to show how it will look if it’s a heavy query and needs some loading time.
 searchajax3

This is what the result will look like, note that everything is done within an UpdatePanel and we do not experience the page to reload, or any visual postbacks.
 searchajax4

Download the UserControl here

Author: Tobias Zimmergren
Url:
http://www.zimmergren.net

After being rather busy the last couple of weeks due to taking the SharePoint Certifications as well as tutoring some MOSS 2007 Development around the country it has finally begun to lighten up again. Being the geeky nerd that I am (Yeah, like you aint?), of course the first thing that comes to my mind is to complete the two articles about customizing the Search Results Page with a third post on the subject which will show you a trick to use SharePoint Designer to generate your custom XSLT. These posts are by no means any in-depth articles on the subject, but rather a pointer to get you started on the journey. If there’s interest to create a more in-depth article series about the subject, don’t hesitate to contact me using the contactlink from my blog or leave a comment to this post.

Please refer to the previous articles if you have any questions about editing the xslt for your Search Result. They can be found here:
MOSS 2007: Customize the Search Result using XSLT
MOSS 2007: Customizing the Search Results Page (XSLT) – Part 2 – Add highlighting

Step by step

First of all, take a look at this picture to understand how it looks before the changes are done (this picture illustrates a standard-layout of the Search Core Results WebPart that is shown when you perform a search in the Search Center) 
searchresultsthree1

Modify the XSLT of the Search Core Results Web Part to get the raw XML

The search results are actually based on plain XML (which is why we can use XSLT to customize the appearance of the results to a high extent) so what we will do here is to basically use standard XSLT to get ALL the XML elements displayed in the search results as raw XML. This is done because we will use this raw XML in SharePoint Designer to generate some good looking XSLT markup for our Search Core Results Web Part.

Replace the existing XSLT markup from the Search Core Results Web Part with the following snippet (which basically just give us the raw XML output when searching):

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
  <xmp><xsl:copy-of select="*"/></xmp>
</xsl:template>
</xsl:stylesheet>

 searchresultsthree2

Now if you publish the page, you will see a result like the result in the following picure, which illustrates how the raw XML could look: 
searchresultsthree3

Make use of the raw XML that SharePoint generated for us in the Search Core Results Web Part

Copy all the raw XML data (including the <All_Results> tags and save to a new XML-file (I named mine rawsearchresult.xml)

When you’ve copied down the raw XML and saved the file, launch SharePoint Designer 2007 – Let the magic begin!

 

Use SharePoint Designer 2007 to customize the XSLT for your Search Result Page in SharePoint 2007

Launch Microsoft SharePoint Designer 2007 and open up your SharePoint site (by going to "File" – "Open Site.." and enter the url to your SharePoint site (in my case, it’s "http://zimmergren" and hit open)

Next, choose File – New – "ASPX" to create a new ASP.NET page. Note that you do not need to save this page because we will only use the page as a base when we customize our XSLT using SharePoint Designer. Later, when we are satisfied with the presentation of our search results, we will simply copy the generated XSLT and close the new .aspx page and ignore the changes. 
searchresultsthree4

Now from the File-meny choose "Data View" – "Insert Data View" to insert a standard DataFormWebPart.

Note, when inserting the aforementioned Data View, the Data Source Library is opened/displayed in the top right pane (if you havn’t customized the appearance of SPD) as seen here: 
searchresultsthree5

In this newly opened Data Source Library we will expand the node that says "XML Files" and choose "Add an XML file…". Browse to your XML file that contains the raw XML and hit okay. 
searchresultsthree6

You will be confronted with a question asking you to import the file into SharePoint, press Ok. When you’ve hit OK until you’re back on the aspx-page, you will see your newly added XML file under the "XML Files" node in the tree in the Data Source Library and in my case it’s called "rawsearchresults.xml"
searchresultsthree7

Click the dropdown of your file, and choose "Show Data". Next, choose the tags/entities that you want to include in the presentation of your Search Result by holding down Ctrl + clicking the ones you’d like to insert. 
searchresultsthree8

Simply drag and drop those items onto the DataFormWebPart on your ASPX-page and it will automatically render the XSLT for you, like so: 
searchresultsthree9

Now, either manually edit the presentation of your search results – or choose the quick edit for your DataFormWebPart and click "Change layout…"
searchresultsthree10

On dialog, choose your desired layout to base the presentation of your search results on. 
searchresultsthree11

When we’ve done this, SharePoint Designer automatically renders the XSLT for us (based on the XML File we chose, that contains our raw XML for the Search Results (which is also why we get the nice preview in SharePoint Designer)) 
searchresultsthree12

Now, that might not be the best layout to use for displaying the search results on a page.. So we will have to do some manual tweaking in order to get the presentation of this XSLT to fully fit our needs and demands.

Something that is important to note is how we can e.g. change the title to become a hyperlink that links to the acutal object by choosing the title-element and using the Quick Edit to change some properties. Note that I changed the title to a Hyperlink, which links to {url} that is part of the Search Result and also setting the title to {title} which also is an element in the Search Result.
searchresultsthree13

Do all your manual tweaking (either by customizing the XSLT from the source view, or as the previous picture illustrated) and continue to the next step.

Tip: You can of course add Sorting, Filtering and Grouping aswell by simply choosing it in the same dialog that we chose to change the layout..

Use the XSLT that was rendered by SharePoint Designer 2007 in the Search Core Results Web Part

Switch to Split View or Source View, and copy the entire <xsl:stylesheet> tag and all content. 
searchresultsthree14

Now simply paste the generated XSLT into your Search Core Results WebPart’s XML-section.

NOTE: If you can’t see the entire Web Part and thereby not being able to access the edit-button, you can simply enter the querystring: ?contents=1 which will take you to the Web Part Maintenence Page for your site, where you can delete the webpart, and then add a new one as usual, and edit the XSLT of the new Search Core Results Web Part instead.

Publish the page, and behold your new presentation of the Search Results. Please note that I didn’t make any heavy customizations to my XSLT and therefore it’s rather steril, but you can make some major changes in the XSLT and in SharePoint Designer if you really want to customize the display of your Search Results.

This is how my presentation of the Search Results look like: 
searchresultsthree15

I love feedback and comments :)

If you liked this article please leave a comment with feedback so I know that people read it, otherwise it’s boring to write these step by step illustrated articles.

Cheers, and good weekend.

Author: Tobias Zimmergren
Url:
http://www.zimmergren.net

In one of my previous blogposts I wrote about how you easily could alter the XSLT of a the Search Core Results Web Part on your Search Results Page in order to achieve a customization to the presentation of the output.

In this article I will scratch on the surface of some more XSLT and show you how you can implement the HitHighligting Template in order to achieve colored/customized display of the search words you entered.

What is the HitHighligting Template?

Well, basically the HitHighligting template offers you the ability to highlight words that are used in your search. It offers you the possibility to highlight words in the following three result sections: Title, Url and Description (And that’s basically all you need, mostly)

 searchresultstwo1

Study the following XSLT, as per MSDN:

<hithighlightedsummary>
  <c0>SharePoint</c0> <c1>namespace</c1> provides types and members that can be used for working with a <c0>SharePoint</c0> site  <ddd /> a top-level <c2>class</c2> that represents a <c0>SharePoint</c0> site and provides access to its collection of subsites <ddd /> <c0>SharePoint</c0> <c1>namespace</c1> and a brief description of each.
</hithighlightedsummary>
<hithighlightedproperties>
  <HHTitle>Microsoft.<c0>SharePoint</c0> <c1>Namespace</c1></HHTitle>
  <HHUrl>
http://msdn.microsoft.com/library/default.asp?url=/library/en-     us/spptsdk/html/tsnsMicrosoft<c0>SharePoint</c0>_SV01017995.asp</HHUrl>
</hithighlightedproperties>

You may notice that the sections hithighlightedsummary, HHtitle and HHUrl elements contain childs (<c0>,<c1> etc). This basically means that for each instance of the words entered in your search, you get a set of highlight-tags that encloses that word. This is the default behaviour of the SharePoint Search. First word gets <c0>, second word gets <c1> and so on…

How do I add the Highlighting functionality?

Note: If you do not know how to access the XSLT of the Search Core Results Web Part, view my previous post on the subject.

In order to customize the presentation of the search result and make your words highlighted, you basically only need to add some tags to the XSL-template for each search word you want to highlight as you can see in the screenshot below.

Now locate the following section in your Search Core Results Web Part (It already exist):

<xsl:template name="Hithightlighting">

And since this template exists from the beginning, all you really have to do is to customize the style attribute and add a color property of the <b> tag (I replaced it with a <strong> tag instead, for sake of standards)
Then you can simply specify the styles for each highlighted word as picted in the following screenshot:

 searchresultstwo2

It’s simple as that. I hope this helped some of you to get started on some basic Search Core Results XSLT customizations.

Author: Tobias Zimmergren
Url:
http://www.zimmergren.net

The other day I got a comment on a post from one of my readers who wanted to know how you can connect your custom created Search Page with a specific Search Scope.

Create a custom Search Page

  1. Navigate to your Search Center (http://yourcompany/SearchCenter)
  2. Choose "Site Actions -> Create Page"
  3. Create a new Search Page by using the "(Welcome Page) Search Page" template and fill in your details

It should look like this:
customsearchpagescope1

Create a custom Search Results Page

  1. Make sure that you are back at the Search Center site
  2. Choose "Site Actions -> Create Page"
  3. Create a new Search Results Page by using the "(Welcome Page) Search Results Page" template and fill in your details

It should look something like this:
customsearchpagescope2

Add the newly created Search Page to the tablist in your Search Center

  1. Make sure that you are back at the Search Center site
  2. Choose "Site Actions -> View All Site Contents"

You will now see one list for the Search Pages and one list for the Search Results Pages, as seen in this picture:
customsearchpagescope3

  1. Navigate to "Tabs in Search Pages"
  2. Choose "New -> New Item"
  3. Enter the Title, Page (The page.aspx you created earlier. I used ZimmerSearch.aspx) and optionally enter a Tooltip
  4. Click "OK"
  5. You will see your new Tab show up in the list

Add the newly created Search Results Page to the Tablist in your Search Center

  1. In the top of your left menu you will see "View All Site Content", Click it.
  2. Repeat the steps from the previous section but use the Search Results Page you created instead.

If you navigate to your Search Center, you will see that your Tab has been added to the Tablist:
customsearchpagescope4

Connect your Search Page  with your Search Results Page

  1. Click on your newly created Tab
  2. Choose "Site Actions -> Edit Page"
  3. Choose "Edit -> Modify This Shared Web Part" on your Search Box
    customsearchpagescope5
  4. Under the "Scopes Dropdown" section choose "Show, do not include contextual scopes" in the Dropdown mode
  5. Enter a Dropdown label if you’d like

It should look something like this:
customsearchpagescope6

  1. Expand the "Miscellaneous" section
  2. Enter your Search Results Page filename into the "Target search results page URL" textbox (I used ZimmerSearchResults.aspx)
  3. Click "Ok"

Now publish the page and it should look something like this:
customsearchpagescope7

Make sure it works

  1. Make a search on your custom Search Page
  2. Make sure that the url contians your custom Search Results Page
    (Mine is: http://zimmer/SearchCenter/Pages/ZimmerSearchResults.aspx)
  3. It works!

Can I bind the Search Page to a specific Scope?

Of course you can. Follow these steps:

  1. Navigate to the Site’s Scope’s section (I usually just navigate to http://zimmer/_layouts/viewscopes.aspx?mode=site)
    (This can be done by just navigating to Site Settings, Go to Top Level site settings, Search Scopes)
  2. Choose "New Display Group"
  3. Enter a Title (Important: Remember this name!)
  4. Choose your Scope in the Scopes list
    customsearchpagescope8
  5. Make sure it’s also the Default Scope
  6. Click OK

Your displaygroup should be shown with a scope, similar to this:
customsearchpagescope9

  1. Go back to your Search Center
  2. Navigate to your custom created Search Page
  3. Again, choose "Site Actions -> Edit Page"
  4. Expand the "Miscellaneous" section
  5. Locate the "Scope Display Group" text box
  6. Enter your newly created Display Group (The name of the display group, mine was Zimmer)
  7. Click "OK"
  8. Publish your page

The Dropdown with Scopes should now only contain your newly added Display Group, similar to the following screenshot:
customsearchpagescope10

And what do you know… It works :)

Thanks for taking your time to read this, please leave a comment or two :)

MOSS 2007: Customize the Search Result (using XSLT)

August 23rd, 2007 by Tobias Zimmergren

Author: Tobias Zimmergren
Url:
http://www.zimmergren.net

Since people have been bugging me to get started with the blogging again, I guess I should just take their advice and get to it.

This blogpost will cover the basics of customizing your search results-page using XSLT.

I will in a later blogpost also show you how you can use SharePoint Designer as a tool to create the actual XSLT for you in combination with the DataViewer Web Part, and then how you can modify the created XSLT to match whatever specifications you’ve got in your designs.

I would recommend creating a new Search Page and Search Results Page to use, but for this little demo I’ll just use the default search page and search results page.

Let’s get started then..

First of, take a look at the search results page (the page you see when you’ve made a search):
customsearchresultsone1 

From here, take the following actions:

  1. Choose Site Actions -> Edit Page
  2. Locate the "Search Core Results" web part, and choose "Edit" -> "Modify Shared WebPart"
  3. Locate "Data View Properties" and choose the huge "XSL Editor…" button :)

You should now see something like this:
customsearchresultsone2

Now all you need to do (if you wish to use the existing properties) is to add your custom xhtml (I tend to say xhtml instead of html to mark the importance of web standards and cross-browser compatability).

I just added some style-attributes to the body div and the results template span-tag to mark my point. I did by no means put any energy into making this look nice. Please believe me ;)

And this is the final "stylish" outcome:
customsearchresultsone3

 

What have we accomplished today then? Well, nothing big at all. Just a little tip on how you can customize the Search Result presentation with minimum knowledge or efforts. I however will in one of my next blogposts let you in on a little tip on how to use SharePoint Designer and the Data View Web Part to create the custom XSLT for you fully automatically instead of customizing the existing XSLT with your own xhtml. That basically means that it’s dead-easy to change the looks, layout and appearance of the search results in a much more extensive!

That’s a wrap!
By the way; I love comments and try to answer them, feel free to add one while you’re here :)

MOSS 2007: Search and Indexing

November 16th, 2006 by Tobias Zimmergren

In this post I will show you how to configure search by creating a content source that should be indexed and a search scope to limit the results when searcing. I will also show you how to customize the Search Center and adding a tab with a custom search and search results page.

I will walk you though how to set up searchscopes and content sources (such as fileshares).

We will begin by creating a content source and a search scope This will presume that youve got a network share with files and folders, e.g. the share whateversomeShare mapped against Z: on your local system.

1. Open SharePoint Central Administration and the Shared Services Provider admin site.
2. Open the Search Settings page
3. Choose the Content Sources link in the Crawl Settings section.
4. Choose New Content Source in the toolbar menu
5. Enter a name (I used "Demo Documents")
6. Choose File Shares as Content Source Type
7. Enter the start address (e.g. whateversomeShare)
8. Choose if it should include all subfolders or not under Crawl Settings
9. Set a schedule of your preference and choose to start the crawl if you want, then click OK
10. It should now look something similar to this image:

Screendump (Image broken due to SharePointBlogs.com crash )

11.

Now you need to start the crawl, if you didn’t do so when creating the content source

Creating a scope to narrow down the search results to only file shares
1. Navigate to Site Settings
2. Click on View Scopes in the Scope Settings section
3. Click Create New Scope in the toolbar and enter e.g. "File Shares" as the name and click OK
4. Note that the "Items" column states "Empty".
5. Click on the name (File Shares) to navigate to the Scope Properties and Rules page
6. Select "Empty > Add rules"
7. Select "Demo Documents" in the Content Scope and press OK to create the rule.
8. Now note that it says "New Scope – Ready after the next update (starts in n minutes)." To avoid this waitint time, go back to the Search Settings and click "Start Update Now" under the Scopes section.
9. Click the Site Settings menu at the top right of this site collection and choose Search scopes
10. Click the "Search Dropdown" display group and then check the "File Shares" scope and click OK.
11. Go to the Search Center to validate that the scope actually works and shows in the drop down