如何使用contains参数从Sitecore中选择内容项。Sitecore查询非常慢

如何使用contains参数从Sitecore中选择内容项。Sitecore查询非常慢,sitecore,sitecore6,Sitecore,Sitecore6,我有一个名为“会议”的Sitecore数据模板。它有一个名为“附加活动”的字段。此字段是一个多列表,允许内容编辑器将许多不同的活动与会议关联。我的会议内容项并非全部位于内容树中的同一文件夹中。它们分布在整个现场。给定一个特定的活动,我需要能够找到并显示该活动所有相关会议的列表。现在我正在使用Sitecore查询,如下所示: /Sitecore/Content/Home//*[(@@templatename='Meeting') and (contains (@@#Additional Activ

我有一个名为“会议”的Sitecore数据模板。它有一个名为“附加活动”的字段。此字段是一个多列表,允许内容编辑器将许多不同的活动与会议关联。我的会议内容项并非全部位于内容树中的同一文件夹中。它们分布在整个现场。给定一个特定的活动,我需要能够找到并显示该活动所有相关会议的列表。现在我正在使用Sitecore查询,如下所示:

/Sitecore/Content/Home//*[(@@templatename='Meeting') and (contains (@@#Additional Activities#, '{C73FAE38-DBF5-42C9-B872-8E412B99E9DE}'))]

这是可行的,但速度非常慢。我曾考虑过创建某种可以查询的内存缓存,但在何时重建缓存方面遇到了问题。我也想过使用Lucene,但我发现Lucene查询实现起来非常复杂。有没有人对更好的方法有什么建议?我是否应该使用Sitecore查询来获取内容树中所有会议的列表,然后对其进行迭代?

Lucene查询,并对所有会议项目进行索引


会很快的。您是在Sitecore 7还是6上?我猜标签上写着6,所以使用marketplace的高级数据库爬虫来设置索引,查询应该非常简单。

根据您的Sitecore版本,您也可以使用快速查询:

query:fast:/Sitecore/Content/Home//*[@@templatename='Meeting' 
       and @@#Additional Activities#='%{C73FAE38-DBF5-42C9-B872-8E412B99E9DE}%'] 

除了Lucene之外,还有一个选择,就是你正在尝试做的事情。让我说清楚;我同意克劳斯的观点,调查Lucene是推荐的路线。话虽如此,;这是另一个版本。对于您尝试执行的操作,可以使用Sitecore链接数据库。只要你只想找到涉及某一特定活动的会议,它就会为你带来好处

代码如下所示:

       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 />" );
            }
        }
Item activityTemplate=Sitecore.Context.Database.GetItem(“/Sitecore/templates/path/to/your/activity/template”);
var links=新列表(Globals.LinkDatabase.GetItemReferrers(activityTemplate,false));
List filteredLinks=links.FindAll(il=>il.SourceDatabaseName==Sitecore.Context.Database.Name);
//过滤链接现在是对活动的所有引用的列表
foreach(过滤器链接中的ItemLink fl)
{
Item si=fl.GetSourceItem();
//检查引用是否为会议项目
if(si.TemplateID==Sitecore.Data.ID.Parse({0E06BFCA-3595-4F31-BDBF-746EE6663B4A})和&si.path.FullPath.StartsWith(“/Sitecore/content”))
{
//si是您的会议项目
Response.Write(si.path.FullPath+“
”); } }

此查询的执行时间与Lucene等效查询的执行时间一样快(可能稍快),而且肯定比原始Sitecore查询快。

同意。Advanced Database Crawler大大降低了Lucene的复杂性我曾经尝试过使用Advanced Database Crawler。我根本不懂如何使用它。我发现文档缺乏且令人困惑。
Contains()
不受支持,但您可以使用通配符-p6:谢谢。我第一次在文档中忽略了它。更新了我的答案:)