Sitecore Search TotalSearchResults属性是否将项目安全性考虑在内?

本文关键字:安全性 项目 TotalSearchResults Search 属性 是否 Sitecore | 更新日期: 2023-09-27 18:08:22

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

我执行搜索,跳到适当的页面,只取该页所需的量,TotalSearchResults值为31。然而,Results本身是零(这是正确的)。

在我的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.TotalSearchResults = 31
myResults.Count() = 0

正确的结果应该是零项返回,因为所有的项都是受安全限制的。所以myResults.Count() = 0是正确的。然而,TotalSearchResults = 31是错误的。

TotalSearchResults是否忽略Sitecore安全?

Sitecore Search TotalSearchResults属性是否将项目安全性考虑在内?

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

真正重要的是你索引条目的实际方式和你放在那里的内容。您可以从以下选项中考虑适合您的情况:

  1. 完全避免放置安全保护的物品(不是最佳方案)

  2. 同时放置free和带有附加安全数据的项目(例如,您可以在computed字段中指定),并添加附加子句来筛选和仅选择free项目。您可以考虑从标准模板中索引一个名为__Security的字段,该字段具有管道分隔的安全设置

  3. 包括(外部,而不是从索引)安全检查到你的Linq查询作为一个额外的子句(保持索引本身不变),但从性能的角度来看,这似乎不太好,需要考虑好大数字的情况(不像以前的安全存储在索引和Lucene查询解决)