2016-09-06 2 views
3

Я создал пользовательский индекс Lucene в 8.1 среде Sitecore так:Sitecore пользовательских индексов языков Настройка

<?xml version="1.0"?> 
<configuration xmlns:x="http://www.sitecore.net/xmlconfig/"> 
    <sitecore> 
    <contentSearch> 
     <configuration type="Sitecore.ContentSearch.ContentSearchConfiguration, Sitecore.ContentSearch"> 
     <indexes hint="list:AddIndex"> 
      <index id="Products_index" type="Sitecore.ContentSearch.LuceneProvider.LuceneIndex, Sitecore.ContentSearch.LuceneProvider"> 
      <param desc="name">$(id)</param> 
      <param desc="folder">$(id)</param> 
      <param desc="propertyStore" ref="contentSearch/indexConfigurations/databasePropertyStore" param1="$(id)" /> 
      <configuration ref="contentSearch/indexConfigurations/ProductIndexConfiguration" /> 
      <strategies hint="list:AddStrategy"> 
       <strategy ref="contentSearch/indexConfigurations/indexUpdateStrategies/onPublishEndAsync" /> 
      </strategies> 
      <commitPolicyExecutor type="Sitecore.ContentSearch.CommitPolicyExecutor, Sitecore.ContentSearch"> 
       <policies hint="list:AddCommitPolicy"> 
       <policy type="Sitecore.ContentSearch.TimeIntervalCommitPolicy, Sitecore.ContentSearch" /> 
       </policies> 
      </commitPolicyExecutor> 
      <locations hint="list:AddCrawler"> 
       <crawler type="Sitecore.ContentSearch.SitecoreItemCrawler, Sitecore.ContentSearch"> 
       <Database>master</Database> 
       <Root>/sitecore/content/General/Product Repository</Root> 
       </crawler> 
      </locations> 
      <enableItemLanguageFallback>false</enableItemLanguageFallback> 
      <enableFieldLanguageFallback>false</enableFieldLanguageFallback> 
      </index> 
     </indexes> 
     </configuration> 

     <indexConfigurations> 
     <ProductIndexConfiguration type="Sitecore.ContentSearch.LuceneProvider.LuceneIndexConfiguration, Sitecore.ContentSearch.LuceneProvider"> 
      <initializeOnAdd>true</initializeOnAdd> 
      <analyzer ref="contentSearch/indexConfigurations/defaultLuceneIndexConfiguration/analyzer" /> 
      <documentBuilderType>Sitecore.ContentSearch.LuceneProvider.LuceneDocumentBuilder, Sitecore.ContentSearch.LuceneProvider</documentBuilderType> 
      <fieldMap type="Sitecore.ContentSearch.FieldMap, Sitecore.ContentSearch"> 
      <fieldNames hint="raw:AddFieldByFieldName"> 
       <field fieldName="_uniqueid" storageType="YES" indexType="TOKENIZED" vectorType="NO" boost="1f" type="System.String" settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider"> 
       <analyzer type="Sitecore.ContentSearch.LuceneProvider.Analyzers.LowerCaseKeywordAnalyzer, Sitecore.ContentSearch.LuceneProvider" /> 
       </field> 
       <field fieldName="key" storageType="YES" indexType="UNTOKENIZED" vectorType="NO" boost="1f" type="System.String" settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider"/> 
      </fieldNames> 
      </fieldMap> 
      <documentOptions type="Sitecore.ContentSearch.LuceneProvider.LuceneDocumentBuilderOptions, Sitecore.ContentSearch.LuceneProvider"> 
      <indexAllFields>true</indexAllFields> 
      <include hint="list:AddIncludedTemplate"> 
       <Product>{843B9598-318D-4AFA-B8C8-07E3DF5C6738}</Product> 
      </include> 
      </documentOptions> 
      <fieldReaders ref="contentSearch/indexConfigurations/defaultLuceneIndexConfiguration/fieldReaders"/> 
      <indexFieldStorageValueFormatter ref="contentSearch/indexConfigurations/defaultLuceneIndexConfiguration/indexFieldStorageValueFormatter"/> 
      <indexDocumentPropertyMapper ref="contentSearch/indexConfigurations/defaultLuceneIndexConfiguration/indexDocumentPropertyMapper"/> 
     </ProductIndexConfiguration> 
     </indexConfigurations> 
    </contentSearch> 
    </sitecore> 
</configuration> 

На самом деле довольно простой индекс, который указывает на корень, включает в себя шаблон и хранит поле. Все работает. Но мне нужно что-то дополнительно:

  • Лимит записей в индексе до последней версии
  • Лимит записи в индексе на одном языке (английском)

Я знаю, это может быть легко запускаемые в запросе, но я хочу, чтобы мои индексы были меньшими, чтобы они (быстрее) выполнялись быстрее.

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

Второй вариант (ограничение языков) на самом деле более важен, так как он мне также понадобится в других индексах. Легкий ответ, вероятно, также заключается в использовании пользовательского искателя, но я надеялся, что будет возможность настроить его без специального кода. Можно ли настроить собственный индекс, чтобы включить только определенный набор языков (один или несколько) вместо всех?

ответ

0

После некоторых исследований я пришел к выводу, что для соответствия всем требованиям пользовательский искатель был единственным решением. Прокомментировал код: http://ggullentops.blogspot.be/2016/10/custom-sitecore-index-crawler.html

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

Существует довольно некоторый код, поэтому я не буду копировать его здесь, но нам пришлось переопределить методы DoAdd и DoUpdate для SitecoreItemCrawler, а для языков мы также должны были сделать небольшое переопределение метода Update.

0

Вы можете легко создать собственный процессор, который позволит отфильтровать то, что вы хотите:

namespace Sitecore.Custom 
{ 
    public class CustomInboundIndexFilter : InboundIndexFilterProcessor 
    { 
     public override void Process(InboundIndexFilterArgs args) 
     { 
      var item = args.IndexableToIndex as SitecoreIndexableItem; 
      var language = Sitecore.Data.Managers.LanguageManager.GetLanguage("en"); 

      if (item != null && (!item.Item.Versions.IsLatestVersion() || item.Item.Language == language)) 
      { 
       args.IsExcluded = true; 
      } 
     } 
    } 
} 

И добавить этот процессор в конфигурации:

<pipelines> 
    <indexing.filterIndex.inbound> 
    <processor type="Sitecore.Custom.CustomInboundIndexFilter, Sitecore.Custom"></processor> 
    </indexing.filterIndex.inbound> 
</pipelines> 
+1

Если я использую InboundIndexFilter, это не будет использоваться для всех индексов? Мне нужно настроить его на один индекс (иначе я также удалю языки из стандартных индексов Sitecore). – Gatogordo

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