将 Kentico 智能搜索索引分配给 CMSSearchResults 控件数据源
Assign Kentico smart search index to CMSSearchResults control datasource
编辑: 也许这会让我的问题更清楚。我想这样做,但使用 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>
在我后面的代码中,我正在研究一种方法,该方法应该检索典型的自定义 table 智能搜索索引,并将索引中的数据用作 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 服务器中的一组数据,并将该数据转换为存储在 Kentico 项目的网络服务器文件系统中的 b 树。
所以,我期待 SearchIndexInfo
中的一种方法,它沿着解析该索引文件并将 b 树作为 LinkedList<t>
或可以提供一些方法的方式返回将链表排序为 DataSet
的参数 - 或者至少进行了解析并允许我进行转换。但是没有这样的运气,我不确定从这里去哪里。
我应该如何将搜索索引 DataSet
绑定到 CMSSearchResults
控件?
一旦您已经开始自定义,我建议您从头开始构建您自己的控件,但使用 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;
}
编辑: 也许这会让我的问题更清楚。我想这样做,但使用 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>
在我后面的代码中,我正在研究一种方法,该方法应该检索典型的自定义 table 智能搜索索引,并将索引中的数据用作 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 服务器中的一组数据,并将该数据转换为存储在 Kentico 项目的网络服务器文件系统中的 b 树。
所以,我期待 SearchIndexInfo
中的一种方法,它沿着解析该索引文件并将 b 树作为 LinkedList<t>
或可以提供一些方法的方式返回将链表排序为 DataSet
的参数 - 或者至少进行了解析并允许我进行转换。但是没有这样的运气,我不确定从这里去哪里。
我应该如何将搜索索引 DataSet
绑定到 CMSSearchResults
控件?
一旦您已经开始自定义,我建议您从头开始构建您自己的控件,但使用 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;
}