Ricerca…


Osservazioni

La ricerca Sitecore si basa su Lucene, offrendo la possibilità di creare funzionalità di ricerca molto veloci per il tuo sito. Invece di interrogare su un database centralizzato (come il DB SQL di Sitecore), interroga i file indice di Lucene che sono memorizzati sul file system fisico del server web. Sitecore fornisce uno strato di astrazione sull'API Lucene.NET che include un provider LINQ che rende la scrittura di query Lucene un processo semplice e familiare per gli sviluppatori .NET. Sitecore viene fornito con alcuni indici standard configurati che è possibile estendere o definire autonomamente. Puoi anche scegliere di utilizzare SOLR; una piattaforma centralizzata e scalabile costruita su Lucene.

Configurazione

Sitecore viene fornito con un insieme di indici standard preconfigurati che è possibile estendere oppure è possibile definirne di propri. Dei preconfigurati, sitecore_master_index e sitecore_web_index sono di maggiore interesse per la tua ricerca sul sito. Questi sono gli indici predefiniti per tutti gli elementi del tuo Sitecore nella struttura dei tuoi database master e web rispettivamente e sono configurati per memorizzare tutti i campi standard di un oggetto Sitecore che sarà comune tra tutti i modelli.

È possibile visualizzare questa configurazione dell'indice Web standard in questa posizione: <Your Site>\App_Config\Include\Sitecore.ContentSearch.Lucene.Index.Web.config

Le principali aree di importanza della configurazione di un indice sono:

  • La configurazione del campo : quali campi devono essere memorizzati nell'indice e come devono essere memorizzati.
  • La strategia : come e quando l'indice deve essere aggiornato.
  • The Crawler - La posizione in cui l'indice può ottenere i suoi dati Sitecore

Configurazione del campo

Guardando nella configurazione sitecore_web_index , puoi vedere il seguente riferimento: <configuration ref="contentSearch/indexConfigurations/defaultLuceneIndexConfiguration" /> . Questo si riferisce a un file di configurazione dell'indice condiviso trovato qui: <Your Site>\App_Config\Include\Sitecore.ContentSearch.Lucene.DefaultIndexConfiguration.config . Qui puoi vedere tutti i campi che sono inclusi nella configurazione standard.

Ci sono fondamentalmente due modi per definire un campo: o il campo è originato direttamente da un campo item Sitecore, oppure è un campo calcolato. Un campo calcolato consente di scrivere del codice per eseguire alcuni calcoli e memorizzare il risultato nel campo. Questo codice verrà eseguito quando l'indice viene creato / aggiornato non quando l'indice viene interrogato. Ciò è particolarmente utile se il campo deve memorizzare dati aggregati, come i conteggi ecc.

All'interno <fieldMap> vedrai gli elementi <fieldNames hint="raw:AddFieldByFieldName"> & <fields hint="raw:AddComputedIndexField"> , che contengono rispettivamente i campi di provenienza diretta e i campi calcolati.

Strategia

La strategia del tuo indice determina quando il tuo indice viene aggiornato. Ci sono le seguenti opzioni tra cui scegliere:

  • OnPublishEndAsynchronousStrategy (onPublishEndAsync) - Quando un articolo è pubblicato, l'indice verrà aggiornato in modo asincrono.
  • SynchronousStrategy (syncMaster) - Quando un elemento viene salvato, l'indice verrà aggiornato istantaneamente e in modo sincrono.
  • IntervalAsynchronousStrategy (intervalAsyncCore / intervalAsyncMaster) - Verifica periodicamente gli aggiornamenti degli articoli e aggiorna l'indice in modo asincrono
  • ManualStrategy - Nessun aggiornamento automatico dell'indice. Gli indici verranno aggiornati manualmente (tramite il pannello di controllo o programmaticamente)
  • RebuildAfterFullPublishStrategy (rebuildAfterFullPublish) - Dopo una pubblicazione, l'indice verrà ricostruito completamente
  • RemoteRebuildStrategy (remoteRebuild) - Questa strategia è per più istanze di Sitecore. Ad esempio, se viene richiesta una ricostruzione dal server di gestione dei contenuti, i server di consegna del contenuto remoto si iscriveranno a questo evento e ricostruiranno i propri indici.

Per impostazione predefinita, l'indice principale è configurato come syncMaster . Ciò è dovuto al fatto che se sei nell'esperienza editor di salvataggio degli elementi e il rendering sulla pagina visualizza i risultati di un indice, ti consigliamo di vedere le modifiche apportate agli elementi immediatamente nei risultati. L'indice web è configurato come 'onPublishEndAsync', questo perché gli indici del tuo database web devono essere aggiornati solo quando gli articoli sono pubblicati dal database master sul web.

Puoi anche combinare più strategie. Ad esempio, se si dispone di istanze separate di Sitecore per la gestione dei contenuti (CM) e il content delivery (CD), sarebbe opportuno combinare onPublishEndAsync con remoteRebuild , in modo che gli indici dei CD vengano aggiornati quando gli articoli vengono pubblicati e vengono ricostruiti quando un utente attiva una ricostruzione dal pannello di controllo del server CM.

Puoi scegliere la tua strategia usando la seguente configurazione:

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

Il cingolato

Ciò consente di specificare la posizione dei dati Sitecore che si desidera indicizzare. L'indice web ha la seguente configurazione predefinita:

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

I due bit importanti sono gli elementi <Database> e <Root> . L'elemento <Root> consente di specificare la posizione di partenza nell'albero Sitecore che l'indice deve indicizzare. In realtà, è probabile che tu abbia un nodo "Home" sotto il nodo del contenuto che indichi questo in modo che indicizzi solo contenuti / pagine reali anziché i tuoi modelli, ecc.

Crea un filtro in entrata per la ricerca

Il filtro in entrata viene applicato quando l'elemento viene aggiunto all'indice di ricerca e consente di specificare se l'elemento è incluso nell'indice oppure no.

Esempi di utilizzo del filtro in entrata: non includere i valori standard e le versioni precedenti dell'articolo nell'indice.

I filtri in entrata sono impostati nella configurazione:

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

Implementazione del codice:

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

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

Ulteriori esempi e informazioni sono disponibili su http://www.sitecore.net/learn/blogs/technical-blogs/sitecore-7-development-team/posts/2013/04/sitecore-7-inbound-and-outbound- filter-pipelines.aspx

Crea un filtro in uscita per la ricerca

Il filtro in uscita può essere utilizzato per filtrare i risultati della ricerca.

Uno degli esempi di utilizzo del filtro in uscita è la rimozione di elementi a cui l'utente non ha accesso dai risultati di ricerca.

I filtri in uscita sono impostati nella configurazione:

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

Esempio di implementazione del filtro in uscita:

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

Ulteriori esempi e informazioni sono disponibili su http://www.sitecore.net/learn/blogs/technical-blogs/sitecore-7-development-team/posts/2013/04/sitecore-7-inbound-and-outbound- filter-pipelines.aspx

Elimina tutte le versioni precedenti dell'articolo nell'indice quando aggiungi una nuova versione

Di default Sitecore aggiunge tutte le versioni dell'articolo a sitecore_master_index. Lo svantaggio di ciò è che se gli utenti utilizzano i flussi di lavoro e aggiungono molte versioni, tutti verranno aggiunti ai risultati della ricerca nell'editor di contenuti.

Configurazione:

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

Implementazione del gestore

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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow