在知识文章附件内容中搜索

您可以使用知识文章附件将可下载文件包含在知识库文章中。 您还可以使用 Web 文件创建包含可下载内容的常见问题页面。

重要提示

仅可搜索附加到知识文章的文件。 附加到 Web 文件的文件不可搜索。

您可以配置 Power Pages 站点以允许用户在知识库文章的附件内容中搜索。 这可以帮助用户查找他们要找的信息。

在知识库文章中,任何带有已定义前缀的附件都会被编入索引。

要为知识文章附件编制索引,您必须创建以下站点设置,并将其值设置为 True

站点设置 说明
Search/IndexNotesAttachments 指示是否应对知识库文章中的附件内容进行索引。 默认情况下,它设置为 False
KnowledgeManagement/DisplayNotes 指示是否显示知识库文章的附件。 默认情况下,它设置为 False

在搜索词语时,搜索结果也包含附件。 如果搜索词与知识文章附件匹配,还会提供相应知识库文章的链接。 若要查看可下载附件,在左窗格中的记录类型下选择下载。 若要修改下载标签,请编辑搜索/分面/下载内容片段。 默认情况下,该值被设置为下载

备注

必须在您的环境中启用 Dataverse 搜索才能使用此功能。

搜索知识文章附件

如果您的站点使用 Lucene .NET 搜索,可以通过在 Dynamics 365 Customer Service 管理中心或客户服务中心应用中将将知识文章附件同步到站点选项设置为来为网站启用搜索知识文章附件。 如果您的站点使用 Dataverse 搜索,则无需配置此选项,默认情况下,您可以通过知识文章附件进行搜索。

这将允许搜索浏览知识文章附件并让知识用户可以轻松访问信息。 使用此附件功能,您无需使用站点的注释附件。 知识文章附件将会自动同步到注释附件。 详细信息:为门户更新知识文章附件

更新站点配置

如果您已经有 2018 年 4 月之前的网站,并已将您的站点升级到最新版本,则必须使用以下配置来获得与新安装相同的用户体验。

内容代码段

若要修改搜索结果中显示的标签以用于注释和 Web 文件下载,请创建一个内容片段搜索/分面/下载,然后将其值设置为所需值。 默认值为下载

Web 模板

分面搜索 - 结果模板 Web 模板已修改以作为包含相关文章链接的主要搜索结果项目显示与知识库文章关联的文件。 您必须将分面搜索 - 结果模板 Web 模板更新为下列源:

{% assign openTag = '{{' %}
{% assign closingTag = '}}' %}
{%raw%}
  <script id="search-view-results" type="text/x-handlebars-template">
    {{#if items}}
      <div class="page-header">
        <h2>{%endraw%}{{openTag}} stringFormat "{{ resx.Search_Results_Format_String }}" firstResultNumber lastResultNumber itemCount {{closingTag}}{%raw%}
          <em class="querytext">{{{query}}}</em>
          {{#if isResetVisible}}
            <a class="btn btn-default btn-sm facet-clear-all" role="button" title="{%endraw%}{{ snippets['Search/Facet/ClearConstraints'] | default: res['Search_Filter_Clear_All'] }}{%raw%}" tabIndex="0">{%endraw%}{{ snippets['Search/Facet/ClearConstraints'] | default: res['Search_Filter_Clear_All'] }}{%raw%}</a>
          {{/if}}
        </h2>
      </div>
      <ul>
        {{#each items}}
          <li>
            <h3><a title="{{title}}" href="{{url}}">{{#if parent}}<span class="glyphicon glyphicon-file pull-left text-muted" aria-hidden="true"></span>{{/if}}{{title}}</a></h3>
            <p class="fragment">{{{fragment}}}</p>
            {{#if parent}}
              <p class="small related-article">{%endraw%}{{ resx.Related_Article }}{%raw%}: <a title="{{parent.title}}" href="{{parent.absoluteUrl}}">{{parent.title}}</a></p>
            {{/if}}
            <ul class="note-group small list-unstyled">
            {{#if relatedNotes}}
              {{#each relatedNotes}}
                <li class="note-item">
                  {{#if isImage}}
                    <a target="_blank" title="{{title}}" href="{{absoluteUrl}}"><span class="glyphicon glyphicon-file" aria-hidden="true"></span>&nbsp;{{title}}</a>
                  {{else}}
                    <a title="{{title}}" href="{{absoluteUrl}}"><span class="glyphicon glyphicon-file" aria-hidden="true"></span>&nbsp;{{title}}</a>
                  {{/if}}
                  <p class="fragment text-muted">{{{fragment}}}</p>
                </li>
              {{/each}}
            {{/if}}
            {{#if relatedAttachments}}
              {{#each relatedAttachments}}
                <li class="note-item">
                  {{#if isImage}}
                    <a id="kbattachment-{{entityID}}" href="javascript:downloadKbAttachmentFile('kbattachment-{{entityID}}', '{{title}}', {{fileSize}}, '{{fileType}}', '{{downloadBlockUrl}}', '{{initializeDownloadUrl}}')"><span class="glyphicon glyphicon-file" aria-hidden="true"></span>&nbsp;{{title}}</a>
                  {{else}}
                    <a id="kbattachment-{{entityID}}" title="{{title}}" href="javascript:downloadKbAttachmentFile('kbattachment-{{entityID}}', '{{title}}', {{fileSize}}, '{{fileType}}', '{{downloadBlockUrl}}', '{{initializeDownloadUrl}}')"><span class="glyphicon glyphicon-file" aria-hidden="true"></span>&nbsp;{{title}}</a>
                  {{/if}}
                  <p class="fragment text-muted">{{{fragment}}}</p>
                </li>
              {{/each}}
            {{/if}}
            </ul>
          </li>
        {{/each}}
      </ul>
    {{else}}
      <h2>{%endraw%}{{ resx.Search_No_Results_Found }}{%raw%}<em class="querytext">{{{query}}}</em>
        {{#if isResetVisible}}
          <a class="btn btn-default btn-sm facet-clear-all" role="button" title="{%endraw%}{{ snippets['Search/Facet/ClearConstraints'] | default: res['Search_Filter_Clear_All'] }}{%raw%}" tabIndex="0">{%endraw%}{{ snippets['Search/Facet/ClearConstraints'] | default: res['Search_Filter_Clear_All'] }}{%raw%}</a>
        {{/if}}
      </h2>
   {{/if}}
  </script>
  <script type="text/javascript">
    function downloadKbAttachmentFile(attachmentElementId, fileName, fileSize, mimeType, downloadBlockUrl, initializeUrl) {
      // Download block API supports max 4MB block size
      const blockSizeInBytes = 4096 * 1024;
      const totalNumberOfBlocks = parseInt(fileSize / blockSizeInBytes + 1);
      var fileContinuationToken = "";
      var contentString = "";
      var numberOfBlocksDownloaded = 0;
      var blockNumberToContentMap = {};
      function downloadBlockCallback(i, result) {
        numberOfBlocksDownloaded++;
        blockNumberToContentMap[i] = result;
        if (numberOfBlocksDownloaded == totalNumberOfBlocks) {
          for (var j = 0; j < totalNumberOfBlocks; j++) {
            contentString += blockNumberToContentMap[j];
          }
          var isImage = mimeType.startsWith('image/');
          const attachmentElement = document.getElementById(attachmentElementId);
          if (isImage) {
            const bodyByteString = atob(contentString);
            const bodyBuffer = new ArrayBuffer(bodyByteString.length);
            const bodyView = new Uint8Array(bodyBuffer);
            for (var k = 0; k < bodyByteString.length; k++) {
              bodyView[k] = bodyByteString.charCodeAt(k);
            }
            var imageUrl = URL.createObjectURL(new Blob([bodyBuffer], { type: mimeType }));
            attachmentElement.href = imageUrl;
            attachmentElement.target = "_blank";
          }
          else {
            const linkSource = 'data:' + mimeType + ';base64,' + contentString;
            attachmentElement.href = linkSource;
            attachmentElement.download = fileName;
          }
          attachmentElement.click();
        }
      }
      shell.ajaxSafePost({
        type: 'GET',
        url: initializeUrl,
        success: function (result) {
          fileContinuationToken = encodeURIComponent(result);
          for (var i = 0; i < totalNumberOfBlocks; i++) {
            url = downloadBlockUrl + "&blockNumber=" + i + "&fileContinuationToken=" + fileContinuationToken + "&blockSize=" + blockSizeInBytes;
            var x = downloadBlockCallback.bind(this,i);
            shell.ajaxSafePost({
              type: 'GET',
              url: url,
              success: (result) => { x(result) }
            });
          }
        }
      });
    }
  </script>
{%endraw%}

站点设置

您必须将 \_logicalname:annotation~0.9^0.25 值添加到“搜索/查询”站点设置。 添加后,此值应该如下所示:

+(@Query) \_title:(@Query) \_logicalname:knowledgearticle~0.9^0.3 \_logicalname:annotation~0.9^0.25 \_logicalname:adx_webpage~0.9^0.2 -\_logicalname:adx_webfile~0.9 adx_partialurl:(@Query) \_logicalname:adx_blogpost~0.9^0.1 -\_logicalname:adx_communityforumthread~0.9

若要配置分面以在单一分面中分组与知识库文章和 Web 文件关联的注释,编辑 Search/RecordTypeFacetsEntities 站点设置名称并将 ;Downloads:annotation,adx_webfile 追加到它的值中。

若要允许与知识文章关联的附件出现在网站和搜索结果中,编辑 KnowledgeManagement/DisplayNotes 站点设置并将其值设置为 True。 站点设置 KnowledgeManagement/NotesFilter 包含必须添加为注释中注释文本字段的前缀的前缀值;仅具有指定前缀值的注释将出现在网页上。 默认情况下,值为 *WEB*,但可以通过站点设置更改。

若要启用与注释关联的文件附件的索引,创建 Search/IndexNotesAttachments 站点设置并将其值设置为 True