我有一个叫"Meeting“的Sitecore数据模板。它有一个名为“附加活动”的字段。此字段是一个多列表,允许内容编辑器将许多不同的活动与会议相关联。我的会议内容项目并不都位于内容树中的同一文件夹中。它们分布在整个网站上。给定一个特定的活动,我需要能够找到并显示该活动的所有相关会议的列表。现在我正在使用Sitecore查询,如下所示:
/Sitecore/Content/Home//*[(@@templatename='Meeting') and (contains (@@#Additional Activities#, '{C73FAE38-DBF5-42C9-B872-8E412B99E9DE}'))]这是可行的,但它的速度非常慢。我考虑过创建某种可以查询的内存中缓存,但是我在何时重新构建缓存时遇到了问题。我也想过使用Lucene,但我发现Lucene查询实现起来超级复杂。有没有人有更好的建议呢?我应该只使用Sitecore Query来获取内容树中所有会议的列表,然后迭代它们吗?
发布于 2014-01-09 17:27:30
除了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查询快。
发布于 2014-01-09 06:33:50
使用所有会议项目的索引来查询Lucene是可行的。
会很快的。你用的是Sitecore 7还是6?我猜标签是6,所以使用marketplace的高级数据库爬虫来建立索引,查询应该非常简单。
发布于 2014-01-09 07:26:31
根据您的Sitecore版本,您还可以使用快速查询:
query:fast:/Sitecore/Content/Home//*[@@templatename='Meeting'
and @@#Additional Activities#='%{C73FAE38-DBF5-42C9-B872-8E412B99E9DE}%'] https://stackoverflow.com/questions/21006818
复制相似问题