将 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;
}