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安全?
TotalSearchResults返回从索引中保留的实际满足查询的项目计数。如果安全保护项和自由项都在index中,那么它将对该集合进行操作(我认为这就是您所得到的)。默认情况下,索引中没有安全数据。
真正重要的是你索引条目的实际方式和你放在那里的内容。您可以从以下选项中考虑适合您的情况:
-
完全避免放置安全保护的物品(不是最佳方案)
-
同时放置free和带有附加安全数据的项目(例如,您可以在computed字段中指定),并添加附加子句来筛选和仅选择free项目。您可以考虑从标准模板中索引一个名为__Security的字段,该字段具有管道分隔的安全设置
-
包括(外部,而不是从索引)安全检查到你的Linq查询作为一个额外的子句(保持索引本身不变),但从性能的角度来看,这似乎不太好,需要考虑好大数字的情况(不像以前的安全存储在索引和Lucene查询解决)