【问题标题】:Assign Kentico smart search index to CMSSearchResults control datasource将 Kentico 智能搜索索引分配给 CMSSearchResults 控件数据源
【发布时间】:2016-01-21 17:21:06
【问题描述】:

编辑:也许这会让我的问题更清楚。我想这样做,但使用 CMSSearchResults 控件和搜索索引作为数据源:

// 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 文件中有一个 &lt;cms:CMSSearchResults&gt; 控件,如下所示:

<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 项目中网络服务器的文件系统中的 b 树。

所以,我期待SearchIndexInfo 中的一个方法可以执行解析该索引文件并将b-tree 作为LinkedList&lt;t&gt; 返回的方法,或者可以提供一些参数来对链接列表进行排序的方法变成DataSet - 或者至少进行了解析并允许我进行转换。不过没有这样的运气,我不知道从这里去哪里。

我应该如何将搜索索引DataSet 绑定到CMSSearchResults 控件?

【问题讨论】:

  • 控件的哪一部分是自定义的,或者是 OOTB 控件无法做到的?除了编写自定义代码之外,您想要的结果是什么?
  • 我正在使用 OOTB Kentico 控件 - 这些控件不是自定义的,并且我严格使用默认的 Kentico API (v7)。我正在开发的用户控件将使用默认的 Kentico 搜索控件 - 搜索结果、搜索过滤器、搜索对话框 - 但将动态填充它们的属性并根据一些复杂的逻辑触发事件。我在用户控件中进行了设置,因为在 Visual Studio 中管理所有移动部件比通过 Kentico UI 工作要容易得多。如前所述,我只是尝试将搜索索引中的数据绑定到搜索结果控件。
  • 所以从技术上讲,是的,它们是定制的。尽管您使用的是 OOTB 控件,但您正在使用自己的逻辑创建自己的控件,以复制已经编码的相同内容,您可以在 UI 中使用这些内容。那么回到我的其他问题,你想要的结果是什么?你想要一个文本框供用户输入文本吗?你想要一些过滤吗?您想要列表的自定义视图吗?
  • 是的,有一些 Web 部件可以完成我需要做的部分工作,但不是全部。但是,这些 webpart 使用 Kentico 程序集中的控件。是的,我正在制作一个自定义控件,但我正在使用这些 webparts 也使用的 Kentico 控件。我只是将数据插入其中,并根据许多我不想写出也不需要你知道的参数触发不同的视图。这太麻烦了,无法在 UI 中维护。我的问题非常具体:“我应该如何将搜索索引 DataSet 绑定到 CMSSearchResults 控件?”

标签: c# asp.net kentico


【解决方案1】:

一旦您开始进行自定义,我建议您从头开始构建自己的控件,但使用 Kentico 搜索 API 从搜索索引中获取数据。以下是来自 Kentico API 示例的代码 sn-p:

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

【讨论】:

  • 啊,我明白了。实际执行搜索的方法是 SearchHelper 类的一部分。我只需要索引的名称(加上其他参数)来执行查询。这很有意义。谢谢你,罗曼。
猜你喜欢
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 2020-08-23
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
相关资源
最近更新 更多