sitecore
Поиск
Поиск…
замечания
Поиск 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();
}
}
}