编辑:也许这会让我的问题更清晰。我想这样做,但使用CMSSearchResults控件和搜索索引作为DataSource:
// code-in-front
<asp:Repeater ID="Repeater" ruant="server"></asp:Repeater>
// code behind
private void BindDataToRepeater()
{
DataSet ds = PopulateDataSet();
repStuff.DataSource = ds;
repStuff.DataBind();
}
我正在尝试实现自定义搜索用户控件。我的ascx文件中有一个<cms:CMSSearchResults>
控件,如下所示:
<cms:CMSSearchResults ID="ssIssues" runat="server"></cms:CMSSearchResults>
在我的代码中,我正在研究一种方法,该方法应检索典型的自定义表智能搜索索引,并使用索引中的数据作为ssIssues
的数据源。到目前为止,我的内容应该让您大致了解我想要做的事情:
private void BindSearchResults()
{
SearchIndexInfo si = SearchIndexInfoProvider.GetSearchIndexInfo(int searchIndexId);
// some tweaking to convert si to dataset
ssIssues.DataSource = si;
ssIssues.DataBind();
}
然而,马上我遇到了一些问题,似乎无法找到任何可以帮助我理解搜索API的这一部分的文档。
我正在获取正确的SearchIndexInfo
对象,但似乎没有任何方法可以访问索引中的实际数据。现在,我对kentico中搜索索引如何工作的理解是,他们分析SQL Server中的一组数据,并将该数据转换为存储在Kentico项目中Web服务器的文件系统中的b树。
所以,我期待SearchIndexInfo
中的一个方法可以解析索引文件并将b-tree作为LinkedList<t>
或者可以提供一些参数的方法返回。将链表排序为DataSet
- 或至少进行解析并允许我进行转换。没有这样的运气,我不知道从哪里开始。
我应该如何将搜索索引DataSet
绑定到CMSSearchResults
控件?
答案 0 :(得分:1)
一旦您开始使用自定义功能,我建议您从头开始构建自己的控件,但使用Kentico搜索API从搜索索引中获取数据。以下是Kentico API示例的代码段:
private bool SearchText()
{
// Get the search index
SearchIndexInfo index = SearchIndexInfoProvider.GetSearchIndexInfo("MyNewIndex");
if (index != null)
{
// Prepare parameters
SearchParameters parameters = new SearchParameters()
{
SearchFor = "home",
SearchSort = SearchHelper.GetSort("##SCORE##"),
Path = "/%",
ClassNames = "",
CurrentCulture = "EN-US",
DefaultCulture = CultureHelper.DefaultCulture.IetfLanguageTag,
CombineWithDefaultCulture = false,
CheckPermissions = false,
SearchInAttachments = false,
User = (UserInfo)CMSContext.CurrentUser,
SearchIndexes = index.IndexName,
StartingPosition = 0,
DisplayResults = 100,
NumberOfProcessedResults = 100,
NumberOfResults = 0,
AttachmentWhere = String.Empty,
AttachmentOrderBy = String.Empty,
};
// Search
DataSet results = SearchHelper.Search(parameters);
// If found at least one item
if (parameters.NumberOfResults > 0)
{
return true;
}
}
return false;
}