C# Sitecore Search TotalSearchResults属性是否考虑项目安全性?

C# Sitecore Search TotalSearchResults属性是否考虑项目安全性?,c#,solr,sitecore,sitecore7,sitecore7.5,C#,Solr,Sitecore,Sitecore7,Sitecore7.5,我正在使用Sitecore 7.5和SOLR 4.7,我注意到TotalSearchResults属性似乎忽略了项目安全性 我执行搜索,跳到正确的页面,只获取页面所需的金额,TotalSearchResults值为31。但是,结果本身为零(这是正确的) 在我的Sitecore实现中,搜索有31个匹配项,但所有匹配项都受到安全性的限制,匿名用户不应访问这些匹配项。是这样吗?我觉得我错过了什么 public static SearchResults<myCustomSearchResultIt

我正在使用Sitecore 7.5和SOLR 4.7,我注意到
TotalSearchResults
属性似乎忽略了项目安全性

我执行搜索,跳到正确的页面,只获取页面所需的金额,
TotalSearchResults
值为
31
。但是,
结果
本身为零(这是正确的)

在我的Sitecore实现中,搜索有31个匹配项,但所有匹配项都受到安全性的限制,匿名用户不应访问这些匹配项。是这样吗?我觉得我错过了什么

public static SearchResults<myCustomSearchResultItem> SearchContent(string searchTerm, int currentPage, int pageSize, string indexName) {
  using (var context = ContentSearchManager.GetIndex(indexName).CreateSearchContext(SearchSecurityOptions.EnableSecurityCheck)) {
  var query = context.GetQueryable<GeneralSearchResultItem>()
                     .Where(x.Language == Sitecore.Context.Language.Name);
  query = query.Where(i => (i.Content.Contains(searchTerm) || i.Name.Contains(searchTerm)));

  //Paging
  if (currentPage > 1) {
    query = query.Skip((currentPage - 1) * pageSize);
  }

  query = query.Take(pageSize);
  return query.GetResults();
  }
}
正确的结果应为零项,因为所有项都受到安全限制。因此,
myResults.Count()=0
是正确的。但是,
TotalSearchResults=31
是错误的


TotalSearchResults
是否忽略Sitecore安全性?

TotalSearchResults返回从索引中保留的任何项目计数,以满足您的查询。如果安全保护和自由项都在索引中,那么它将针对该集合进行操作(我认为这就是您得到的)。默认情况下,没有安全数据进入索引

真正重要的是你如何做索引项以及你在那里放置了什么。你可以从以下选项考虑你的情况:

  • 完全避免放置受安全保护的项目(不是最佳方案)

  • 放置具有附加安全数据的自由项和项目(例如,您可以在computed字段中指定),并添加附加子句以筛选和仅选择自由项。您可以从名为“y-安全”的标准模板中考虑索引字段,该字段具有针对该项

  • 的管道分隔安全设置。
  • 将(外部,而不是从索引)安全检查作为附加子句包含到Linq查询中(保持索引本身不变),但从性能的角度来看,这似乎不太好,需要考虑大量情况(不像以前的情况,安全性存储在索引中并由Lucene查询解决)


  • TotalSearchResults返回从索引中保留的任何项目计数,这些项目实际上满足您的查询。如果安全保护和自由项都在索引中,那么它将针对该集合进行操作(我认为这就是您得到的)。默认情况下,没有安全数据进入索引

    真正重要的是你如何做索引项以及你在那里放置了什么。你可以从以下选项考虑你的情况:

  • 完全避免放置受安全保护的项目(不是最佳方案)

  • 放置具有附加安全数据的自由项和项目(例如,您可以在computed字段中指定),并添加附加子句以筛选和仅选择自由项。您可以从名为“y-安全”的标准模板中考虑索引字段,该字段具有针对该项

  • 的管道分隔安全设置。
  • 将(外部,而不是从索引)安全检查作为附加子句包含到Linq查询中(保持索引本身不变),但从性能的角度来看,这似乎不太好,需要考虑大量情况(不像以前的情况,安全性存储在索引中并由Lucene查询解决)


  • 好的-那么我想我的问题是-如何获得查询的总结果计数(考虑到安全性)?假设我有100个与特定查询匹配的项,但匿名用户只能使用其中的24个。我使用的页面大小是10。不知何故,我需要找出结果的总数是24个,而不是100个。我怎么做?你怎么配置你的索引?您能否在其中添加具有安全性的自定义计算字段,哪怕只是说wither是否受保护(或者在更复杂的情况下允许访问的实际角色)?我可以,但我可以告诉您,Sitecore 7内置了一些东西,允许您自动考虑安全性,而无需任何额外的自定义编码。如果你看这篇文章()的第二个答案,你就会明白我在说什么。当我创建SearchContext时,您可以说是否要启用安全检查。默认设置是启用安全检查。安全检查对查询有效。它只返回与安全检查匹配的项。因此,查询本身只返回24个结果(来自上面的示例)。但是TotalSearchResults属性似乎没有考虑到安全性。目前只有Lucene可用,我没有机会看到它在SOLR中是如何工作的。我可以看到那里没有安全数据。我想到的是将(外部,而不是索引)安全检查作为一个附加子句包含到Linq查询中(保留索引itesef),但从性能角度看这似乎不太好OK-所以我想我的问题是-如何获得查询的总结果计数(考虑到安全性)?假设我有100个与特定查询匹配的项,但匿名用户只能使用其中的24个。我使用的页面大小是10。不知何故,我需要找出结果的总数是24个,而不是100个。我怎么做?你怎么配置你的索引?您能否在其中添加具有安全性的自定义计算字段,哪怕只是说wither是否受保护(或者在更复杂的情况下允许访问的实际角色)?我可以,但我可以告诉您,Sitecore 7内置了一些东西,允许您自动考虑安全性,而无需任何额外的自定义编码。如果你看这篇文章()的第二个答案,你就会明白我在说什么。当我创建SearchContext时,您可以说是否要启用安全检查。默认设置是启用安全检查。Th
    myResults.TotalSearchResults = 31
    myResults.Count() = 0