我有一个名为“会议”的Sitecore数据模板。它有一个名为“附加活动”的字段。此字段是一个多列表,允许内容编辑器将许多不同的活动与会议相关联。我的会议内容项并非都位于内容树中的同一文件夹中。它们遍布整个网站。给定一个特定的活动,我需要能够找到并显示该活动的所有相关会议的列表。现在我正在使用Sitecore Query,如下所示:
/Sitecore/Content/Home//*[(@@templatename='Meeting') and (contains (@@#Additional Activities#, '{C73FAE38-DBF5-42C9-B872-8E412B99E9DE}'))]
这有效,但速度非常慢。我考虑过创建一些我可以查询的内存缓存,但后来我在重建缓存时遇到了问题。我还想过使用Lucene,但我发现Lucene查询实现起来非常复杂。有没有人对更好的方法有任何建议?我是否应该使用Sitecore Query来获取内容树中的所有会议列表,然后迭代它们?
答案 0 :(得分:3)
Lucene还有一个替代方案,就是你要做的事情。让我明白一点;我同意Klaus的观点,看看Lucene是推荐的路线。话虽如此;这是另一种版本。对于您要执行的操作,您可以使用Sitecore LinkDatabase。只要您只想找到引用特定活动的会议,它就会为您提供帮助。
代码看起来像这样:
Item activityTemplate = Sitecore.Context.Database.GetItem( "/sitecore/templates/path/to/your/activity/template" );
var links = new List<ItemLink>( Globals.LinkDatabase.GetItemReferrers( activityTemplate, false ) );
List<ItemLink> filteredLinks = links.FindAll( il => il.SourceDatabaseName == Sitecore.Context.Database.Name );
// filtered links is now a list of all references to your activity
foreach ( ItemLink fl in filteredLinks )
{
Item si = fl.GetSourceItem();
// Check if the reference is a meeting item
if ( si.TemplateID == Sitecore.Data.ID.Parse( "{0E06BFCA-3595-4F31-BDBF-746EE6663B4A}" ) && si.Paths.FullPath.StartsWith( "/sitecore/content" ) )
{
// si is your meeting item
Response.Write( si.Paths.FullPath + "<br />" );
}
}
此查询的执行时间与Lucene等效的执行时间一样快(可能稍快),并且绝对比原始Sitecore查询更快。
答案 1 :(得分:1)
Lucene查询所有会议项目的索引是可行的方法。
会非常快。你是Sitecore 7还是6?我猜标签是6,所以使用市场上的高级数据库爬虫来设置索引,查询应该非常简单。
答案 2 :(得分:1)
根据您的Sitecore版本,您还可以使用快速查询:
query:fast:/Sitecore/Content/Home//*[@@templatename='Meeting'
and @@#Additional Activities#='%{C73FAE38-DBF5-42C9-B872-8E412B99E9DE}%']