2014-01-08 2 views
1

У меня есть шаблон данных Sitecore под названием «Встреча». Он имеет поле под названием «Дополнительные действия». Это поле представляет собой многостраничный список, который позволяет редактору содержимого связывать множество разных мероприятий со встречей. Элементы контента моего собрания не все живут в одной папке в дереве контента. Они распространяются по всему сайту. Учитывая конкретное действие, мне нужно найти и отобразить список всех связанных совещаний для этой деятельности. Сейчас я использую Sitecore Query следующим образом:Как выбрать элементы контента из Sitecore, используя параметр. Sitecore Query очень медленный

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

Это работает, но это ужасно медленно. Я думал о создании своего рода кэша в памяти, который я мог бы запросить, но потом у меня проблемы с восстановлением кеша. Я также думал об использовании Lucene, но я нашел запросы Lucene очень сложными для реализации. Есть ли у кого-нибудь какие-либо предложения относительно лучшего способа сделать это? Должен ли я просто использовать Sitecore Query для получения списка ВСЕХ собраний в дереве контента, а затем повторить их?

ответ

1

Lucene query withan indexof все, что вы встречаете, - это путь.

Будет очень быстро. Вы в Sitecore 7 или 6? я думаю, что тег говорит 6, поэтому используйте расширенный искатель базы данных с рынка, чтобы настроить индекс, и запрос должен быть довольно простым.

+0

Согласен. Advanced Database Crawler значительно снижает сложность Lucene –

+0

Я попытался начать работу с Advanced Database Crawler один раз. Я не мог понять, как это использовать. Я обнаружил, что документация отсутствует и запутанна. –

1

В зависимости от версии Sitecore, вы также можете использовать Быстрый запрос:

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

'Contains()' не поддерживается, но вы можете использовать Wildcards - p6: [Использование быстрого запроса Sitecore] (http://sdn.sitecore.net/upload/sdn5/developer/using%20sitecore%20fast%20query/using % 20sitecore% 20fast% 20query.pdf # search =% 22fast% 22) – jammykam

+0

спасибо. Впервые я пропустил это в документации. Обновлен мой ответ :) –

2

Существует альтернатива 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 Query.

Смежные вопросы