Had to make some additional staff in EPiServer search functionality. I had to add ability to filter pages by category, page type, and keyword in content. Firstly I have tried to do it with DataFactory.Instance.FindPagesWithCriteria method. But the thing is that I couldn’t find a way to filter data by search keyword.
I knew that SearchDataSource does this somehow and wanted to reuse that logic. But when I looked at it in reflector, I found a method 100 lines long doing some really fancy staff to make select by keywords. So the best way to make search that I need is to do it through SearchDataSource.
Fortunately it provides public property called Criteria. It is a criteria that are going to be passed for underlying DataFactory.FindPagesWithCriteria call.
So the search that I needed could be implemented in the this way. Aspx part:
<EPiServer:SearchDataSource ID="uiSearchDataSource" runat="server" EnableVisibleInMenu="false"
PageLink="<%# PageReference.StartPage %>">
<SelectParameters>
<asp:QueryStringParameter Name="SearchQuery" QueryStringField="search" DefaultValue="" />
</SelectParameters>
</EPiServer:SearchDataSource>
And in code behind:
var pageTypeCategory = new PropertyCriteriaControl(new PropertyCriteria
{
Condition = CompareCondition.Equal,
Name = "PageTypeID",
Type = PropertyDataType.PageType,
Value = PageType.Load("Article").ID.ToString(),
Required = true
});
var pageTypeCategory1 = new PropertyCriteriaControl(new PropertyCriteria
{
Condition = CompareCondition.Equal,
Name = "PageCategory",
Type = PropertyDataType.Category,
Value = Category.Find("category2").ID.ToString(),
Required = true
});
this.uiSearchDataSource.Criteria.Add(pageTypeCategory);
this.uiSearchDataSource.Criteria.Add(pageTypeCategory1);
Note that Name property of each criteria should be as shown in code above, otherwise it won’t work. Hope it helps someone!