Поиск…


замечания

Поиск Sitecore построен поверх Lucene, обеспечивая возможность создания очень быстрых поисковых возможностей для вашего сайта. Вместо запроса к централизованной базе данных (например, SQL DB от Sitecore) он запрашивает файлы индекса Lucene, которые хранятся в физической файловой системе веб-сервера. Sitecore обеспечивает слой абстракции над Lucene.NET API, включая провайдера LINQ, который делает запись запросов Lucene простым и знакомым процессом для разработчиков .NET. Sitecore поставляется с определенными стандартными индексами, которые вы можете расширить или определить самостоятельно. Вы также можете использовать SOLR; централизованная и масштабируемая платформа, построенная на вершине Lucene.

конфигурация

Sitecore поставляется с предварительно настроенным набором стандартных индексов, который вы можете расширить, или вы можете определить свой собственный. Из предварительно сконфигурированных, sitecore_master_index & sitecore_web_index представляют наибольший интерес для вашего поиска по сайту. Это предопределенные индексы для всех ваших элементов Sitecore в дереве ваших основных и веб-баз данных соответственно и настроены на сохранение всех стандартных полей элемента Sitecore, которые будут распространены среди всех шаблонов.

Вы можете посмотреть эту конфигурацию стандартного веб-индекса в этом месте: <Your Site>\App_Config\Include\Sitecore.ContentSearch.Lucene.Index.Web.config

Основными областями важности конфигурации индекса являются:

  • Конфигурация поля. Какие поля должны быть сохранены в индексе и как они должны храниться.
  • Стратегия - как и когда должен обновляться индекс.
  • The Crawler - место, где индекс может получить данные Sitecore

Конфигурация поля

В конфигурацию sitecore_web_index вы можете увидеть следующую ссылку: <configuration ref="contentSearch/indexConfigurations/defaultLuceneIndexConfiguration" /> . Это относится к файлу конфигурации общего индекса, найденному здесь: <Your Site>\App_Config\Include\Sitecore.ContentSearch.Lucene.DefaultIndexConfiguration.config . Здесь вы можете увидеть все поля, включенные в стандартную конфигурацию.

В принципе существует два способа определения поля: либо поле создается напрямую из поля элемента Sitecore, либо это вычисленное поле. Вычисленное поле позволяет вам написать код для выполнения некоторых вычислений и сохранить результат в поле. Этот код будет выполнен, когда индекс будет создан / обновлен не при запросе индекса. Это особенно полезно, если поле должно хранить агрегированные данные, такие как счетчики и т. Д.

В <fieldMap> вы увидите элементы <fieldNames hint="raw:AddFieldByFieldName"> & <fields hint="raw:AddComputedIndexField"> , которые содержат поля с прямым источником и вычисленные поля соответственно.

стратегия

Стратегия вашего индекса определяет, когда ваш индекс обновляется. На выбор доступны следующие варианты:

  • OnPublishEndAsynchronousStrategy (onPublishEndAsync). Когда элемент публикуется, индекс будет обновляться асинхронно.
  • SynchronousStrategy (syncMaster) - Когда элемент сохраняется, индекс будет обновляться мгновенно и синхронно.
  • IntervalAsynchronousStrategy (intervalAsyncCore / intervalAsyncMaster) - Периодически проверяйте обновления элементов и обновляйте индекс асинхронно
  • ManualStrategy - автоматическое обновление индексов. Индексы будут обновляться только вручную (через панель управления или программно)
  • RebuildAfterFullPublishStrategy (rebuildAfterFullPublish) - после публикации, индекс будет полностью восстановлен
  • RemoteRebuildStrategy (remoteRebuild) - эта стратегия предназначена для нескольких экземпляров Sitecore. Например, если на сервере управления контентом вызывается перестройка, серверы доставки удаленного контента будут подписаны на это событие и перестроят свои собственные индексы.

По умолчанию основной индекс настроен как syncMaster . Это связано с тем, что если вы находитесь в редакторе опыта, сохраняя элементы, а рендеринг на странице отображает результаты индекса, вы хотите увидеть изменения, которые вы внесли в элементы сразу в результатах. Веб-индекс настроен как «onPublishEndAsync», потому что индексы вашей веб-базы данных нуждаются только в обновлении, когда элементы публикуются из основной базы данных в Интернете.

Вы также можете комбинировать несколько стратегий. Например, если у вас есть отдельные экземпляры Sitecore для управления контентом (CM) и доставки контента (CD), было бы разумно объединить onPublishEndAsync с remoteRebuild , чтобы индексы CD обновлялись при публикации статей, а также восстанавливались, когда пользователь запускает перестройку с панели управления сервера CM.

Вы можете выбрать свою стратегию, используя следующую конфигурацию:

<strategies hint="list:AddStrategy">
    <strategy ref="contentSearch/indexConfigurations/indexUpdateStrategies/onPublishEndAsync" />
</strategies>

Сканер

Это позволяет указать местоположение данных Sitecore, которые вы хотите индексировать. Веб-индекс имеет следующую конфигурацию по умолчанию:

<locations hint="list:AddCrawler">
    <crawler type="Sitecore.ContentSearch.SitecoreItemCrawler, Sitecore.ContentSearch">
        <Database>web</Database>
        <Root>/sitecore</Root>
    </crawler>
</locations> 

Два важных бита - это элементы <Database> и <Root> . Элемент <Root> позволяет указать начальную позицию в дереве Sitecore, которую индекс должен индексировать. На самом деле у вас, вероятно, есть узел «Home» под узлом контента, на который вы указываете это, чтобы он индексировал только фактический контент / страницы, а не ваши шаблоны и т. Д.

Создайте входящий фильтр для поиска

Входящий фильтр применяется, когда элемент добавляется в индекс поиска и позволяет указать, включен ли элемент в индекс или нет.

Примеры, когда можно использовать входящий фильтр - не включать стандартные значения и предыдущие версии элемента в индекс.

Входящие фильтры устанавливаются в конфигурации:

<indexing.filterIndex.inbound>
 <processor type="Sitecore.ContentSearch.Pipelines.IndexingFilters.ApplyInboundIndexFilter, Sitecore.ContentSearch"></processor>
</indexing.filterIndex.inbound>  

Внедрение кода:

public class ApplyInboundIndexVersionFilter : InboundIndexFilterProcessor   
{        
    public override void Process(InboundIndexFilterArgs args)       
    { 
        var item = args.IndexableToIndex as SitecoreIndexableItem;

        if (!item.Item.Versions.IsLatestVersion())            
        {                  
            args.IsExcluded = true;            
        }
    }
}

Дополнительные примеры и информацию можно найти на http://www.sitecore.net/learn/blogs/technical-blogs/sitecore-7-development-team/posts/2013/04/sitecore-7-inbound-and-outbound- фильтр-pipelines.aspx

Создайте исходящий фильтр для поиска

Исходный фильтр можно использовать для фильтрации результатов поиска.

Одним из примеров использования исходящего фильтра является удаление элементов, к которым пользователь не имеет доступа к результатам поиска.

Исходные фильтры задаются в конфигурации:

<indexing.filterIndex.outbound>
 <processor type="Sitecore.ContentSearch.Pipelines.IndexingFilters.ApplyOutboundSecurityFilter, Sitecore.ContentSearch"></processor>
</indexing.filterIndex.outbound>

Пример реализации исходящего фильтра:

public class ApplyOutboundIndexWorkflowFilter : OutboundIndexFilterProcessor   
{        
    public override void Process(OutboundIndexFilterArgs args)       
    { 
        //You can use args.IsExcluded to remove items from the search results here
    }
}

Дополнительные примеры и информацию можно найти на http://www.sitecore.net/learn/blogs/technical-blogs/sitecore-7-development-team/posts/2013/04/sitecore-7-inbound-and-outbound- фильтр-pipelines.aspx

Удалить все предыдущие версии элемента в индексе при добавлении новой версии

По умолчанию Sitecore добавляет все версии элемента в файл sitecore_master_index. Недостатком этого является то, что если пользователи используют рабочие процессы и добавляют множество версий, все они будут добавлены в результаты поиска в редакторе содержимого.

Конфигурация:

<event name="item:versionAdded" >
              <handler type="FilterPatch.Library.ContentSearch.EventHandler, AssemblyName" method="Execute" />
       </event>

Выполнение обработчика

public class EventHandler
    {
        public void Execute(object sender, EventArgs eventArgs)
        {
            var item = Event.ExtractParameter(eventArgs, 0) as Item;

            //If item has less than 2 versions - then skip
            if(item.Versions.Count < 2)
            {
                return;
            }

            var indexableItem = new SitecoreIndexableItem(item);

            var index = ContentSearchManager.GetIndex(indexableItem);

            using (var context = index.CreateDeleteContext())
            {
                foreach(var version in item.Versions.GetVersions(true))
                {
                    if(!version.Versions.IsLatestVersion())
                    {
                        var indexableItemVersion = new SitecoreIndexableItem(version);
                        context.Delete(indexableItemVersion.UniqueId);
                    }
                }
                context.Commit();                
            }
        }
    }


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow