Как оптимизировать поисковые запросы Sitecore?

Привет, я знаю, что, скорее всего, этот запрос был задан. Как я могу улучшить производительность запросов Sitecore. Я установил dotTrancer и получил результаты, которые вы можете увидеть на этом изображении. Мой метод, в котором я не отображался на изображении, занял 2551 мс, а запрос Sitecore выдал 2344 мс, что огромно. Я использую Sitecore 7.2, я думаю, что в базе данных около 10 тыс. Записей. У нас не более 5 версий на элемент. Мы делаем следующий запрос:

return rootItem.Axes.SelectSingleItem(string.Format("descendant::*[@@{0}='{1}']", attributeName, attributeValue));

attributeName = TemplateName.

У вас есть идеи, как я могу оптимизировать запрос?


person Radu    schedule 06.11.2015    source источник


Ответы (1)


Не используйте Sitecore API для поиска. Используйте поиск Sitecore:

public void Search(Item rootItem, string templateName)
{
    var index = ContentSearchManager.GetIndex("sitecore_" + Sitecore.Context.Database.Name + "_index");
    using (var context = index.CreateSearchContext())
    {
        var result = context.GetQueryable<SearchResultItem>().FirstOrDefault(i => i.TemplateName == templateName && i.Paths.Contains(rootItem.ID));
        if (result != null)
        {
            Item resultItem = result.GetItem();
        }
    }
}
person Marek Musielak    schedule 06.11.2015
comment
@MarekMusilak, спасибо за ответ. Я не знаю, почему иногда, когда я делаю первый запрос, он работает, а когда я делаю, ваша версия не работает. Я перестраиваю индексы, возможно, в этом проблема. - person Radu; 10.11.2015
comment
Однозначно индексы надо перестраивать - person Marek Musielak; 10.11.2015
comment
@MareMusielak Я перестроил индексы и кое-что изменил в коде, все работает нормально. У меня есть вопрос, работает ли вышеуказанный запрос также для чего-то вроде rootItem.Axes.SelectSingleItem (string.Format (ancestor :: * [@ {0} = '{1}'], fieldName, fieldValue))? - person Radu; 10.11.2015
comment
да. Вы можете использовать любое поле. Вам нужно создать свой собственный класс, унаследованный от SearchResultItem, и добавить к нему другие свойства. Проверьте sdn.sitecore.net/upload/sitecore7/70 / - person Marek Musielak; 10.11.2015
comment
Я думал об использовании чего-то вроде быстрого: / потомка :: это правильно? - person Radu; 10.11.2015
comment
Есть некоторые ограничения для быстрого запроса. Вам нужно будет это проверить. Стандартный запрос должен работать, но это не самый быстрый способ - person Marek Musielak; 10.11.2015
comment
@Radu, вы можете сделать что-то вроде этого: context.GetQueryable ‹SearchResultItem› () .FirstOrDefault (i = ›i.TemplateName == templateName && i [foo] .Equals (bar)); это означает, что для перехода к полям используйте индексную нотацию i [fieldname]. I.Paths будет содержать идентификаторы родителей элемента - person Ruben Verschueren; 17.11.2015
comment
@RubenVerschueren да, у меня есть что-то подобное, и это сработало. Спасибо! - person Radu; 18.11.2015