Coveo Search API from within Sitecore
Jun 25, 2012
Coveo Enterprise Search for Sitecore has built-in functionality that allows you to search content and display the results on your website, and as I have explained in a previous post, it is also possible to change the style and the way search query and search results are shown; but sometimes this customization is not enough and it is needed to have more control in the query and how the results are shown.
Open your Visual Studio project and add a reference to Coveo.CES.Web.Search
and Coveo.CNL
.
We will use the following web form:
With this code:
<asp:TextBox ID=“txtTitle” runat=“server”></asp:TextBox>
<asp:Button ID=“SearchButton” runat=“server” Text=“Search” onclick=“SearchButton_Click” />
<br />
<br />
<asp:GridView ID=“resultsGrid” runat=“server” AutoGenerateColumns=“False”>
<Columns>
<asp:BoundField DataField=“SitecoreId” DataFormatString=“{{{0}}}” HeaderText=“Sitecore Id” />
<asp:BoundField DataField=“Title” HeaderText=“Title” />
<asp:BoundField DataField=“Author” HeaderText=“Author” />
</Columns>
<EmptyDataTemplate>
The query returned no results.
</EmptyDataTemplate>
</asp:GridView>
<asp:Label ID=“lblMessage” runat=“server” Text=“” EnableViewState=“false”></asp:Label>
And this code behind:
private void PerformSearch()
{
//Create the search builder object
SearchBuilder searchBuilder = CreateSearchBuilder();
//We will need 10 results
const int numberResults = 10;
//Start with the first item, this is used when paging the results
const int firstResult = 0;
//Sort the results by a field, ascending
searchBuilder.SortBy = Coveo.CES.Web.Search.SortByEnum.FieldAscending;
//Sort by the custom field @MyAuthor
searchBuilder.SortByField = "@MyAuthor";
//Search by the Title (@systitle)
searchBuilder.AddAdvancedExpression(string.Format("@systitle={0}", this.txtTitle.Text));
//Create query wrapper
QueryWrapper query = QueryWrapperFactory.GetNewQueryWrapper(searchBuilder);
//Perform the search
ICESResult[] searchResults = query.GetResults(firstResult, numberResults);
//Check if there are results
if (searchResults != null && searchResults.Length > 0)
{
//For this example, we will create an Anonymous Type (just to
//avoid the creation of an object entity)
//and assign the list to the GridView
var resultList = from result in searchResults
select new
{
Title = result.Title,
SitecoreId = result.GetField("@SCItemID").ToString(),
Author = result.GetField("@MyAuthor").ToString()
};
this.resultsGrid.DataSource = resultList;
this.resultsGrid.DataBind();
this.lblMessage.Text = string.Format("Showing {0} of {1} results", resultList.Count(), query.TotalCount);
}
else
{
this.resultsGrid.DataSource = null;
this.resultsGrid.DataBind();
}
}
private static SearchBuilder CreateSearchBuilder()
{
try
{
var builder = new SearchBuilder();
ICESSearchProvider provider = SearchProviderFactory.CreateDefaultSearchProvider();
builder.Provider = provider;
return builder;
}
catch (Exception ex)
{
//Log the error
return null;
}
}
Don’t forget to add the using statements:
using Coveo.CES.Web.Search.Providers;
using Coveo.CES.Web.Search.Controls;
This is the result:
In the next part of this post, we will do the same query via web services.
Now that we have learned how to query Coveo Enterprise Search by using Coveo DLLs from a Sitecore CMS page, I will show how to do the same query via web services; this code might even be useful for a desktop or mobile component of your Sitecore solution. Open your Visual Studio project and add a Service Reference to http://mycoveoserver:8080/CoveoSearch.asmx
We will use the same web form from the previous post:
With the same code:
<asp:TextBox ID=“txtTitle” runat=“server”></asp:TextBox>
<asp:Button ID=“SearchButton” runat=“server” Text=“Search” onclick=“SearchButton_Click” />
<br />
<br />
<asp:GridView ID=“resultsGrid” runat=“server” AutoGenerateColumns=“False”>
<Columns>
<asp:BoundField DataField=“SitecoreId” DataFormatString=“{{{0}}}” HeaderText=“Sitecore Id” />
<asp:BoundField DataField=“Title” HeaderText=“Title” />
<asp:BoundField DataField=“Author” HeaderText=“Author” />
</Columns>
<EmptyDataTemplate>
The query returned no results.
</EmptyDataTemplate>
</asp:GridView>
<asp:Label ID=“lblMessage” runat=“server” Text=“” EnableViewState=“false”></asp:Label>
And this code behind:
private void PerformSearch()
{
SearchServiceSoapClient searchService = new SearchServiceSoapClient();
//Create the query parameters object
QueryParameters queryParams = new QueryParameters();
//It is necessary to specify all the fields that are needed as results
ArrayOfString neededFields = new ArrayOfString();
//@SCItemID is the Sitecore Item ID
neededFields.Add(“@SCItemID”);
//We will need a custom field too
neededFields.Add(“@MyAuthor”);
//Assign the needed fields array
queryParams.NeededFields = neededFields;
//We will need 10 results
queryParams.NumberOfResults = 10;
//Start with the first item, this is used when paging the results
queryParams.FirstResult = 0;
//Sort the results by a field, ascending
queryParams.SortCriteria = SortByEnum.FieldAscending;
//Sort by the custom field @MyAuthor
queryParams.SortByField = “@MyAuthor”;
//Search by the Title (@systitle)
queryParams.AdvancedQuery = string.Format(“@systitle={0}”, this.txtTitle.Text);
//Perform the search
QueryResults searchResults = searchService.PerformQuery(queryParams);
//Check if there are results
if (searchResults != null &&
searchResults.Results != null &&
searchResults.Results.Length > 0)
{
//The results will be stored in the array ‘searchResults.Results’
//For this example, we will create an Anonymous Type (just to avoid the creation of an object entity)
//and assign the list to the GridView
var resultList = from result in searchResults.Results
select new
{
Title = result.Title,
SitecoreId = result.Fields[0].Value.ToString(),
Author = result.Fields[1].Value.ToString()
};
this.resultsGrid.DataSource = resultList;
this.resultsGrid.DataBind();
this.lblMessage.Text = string.Format(“Showing {0} of {1} results”, resultList.Count(), searchResults.TotalCount);
}
else
{
this.resultsGrid.DataSource = null;
this.resultsGrid.DataBind();
}
}
And we get the exact same results as we got in the previous post:
Related Insights
-
-
-
-
Jonathan Saurez
Unit Testing Using AEM Mocks
Detecting Code Flaws Before They Cause Outages for Your Users
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.